One obvious point not emphasized in previously posted answers is that, YES, requiring
size := extcodesize(_addr)
will guarantee that only a contract can make it past the check if size > 0.
However, the opposite check to see that a sender is NOT a contract (but an EOA) is much more complicated and requires a signature verification scheme in ...
I expected to go somewhere and create one Ethereum account, and then
access that account using different wallet applications.
You can control the same Ethereum account using different wallets. Usually there's a way to export the account's keystore.json or private key from one wallet and import it into the other wallet.
This applies to non-custodial wallets, ...
web3js defines a wallet as a set of public/private key pairs, or, in other words, a set of EOAs.
web3.eth.accounts.create allows to generate a single EOA whereas web3.eth.accounts.wallet.create enables the creation of multiple accounts.
For example :
//create two EOAs
const wallet = web3.eth.accounts.wallet.create(2, 'test');
//get first account properties