python的and是什么意思_Python初学者:“==”and“is”的区别是什么?

本文转载自公众号“读芯术”(ID:AI_Discovery)。

几天前,我在Reddit上浏览“learn python”板块的相关内容时,看到一位Reddit用户再次提问了这个问题:“==” and “is”的区别是什么?虽然网上对此问题已经有太多的答案和解释,但是很多初学者还是不知道,还是会犯错。

“==”和“is”都是Python中的运算符。初学者可能会把“a == b”理解为“a等于b”,而把“a is b” 理解为 “a is b”。也许这就是Python初学者混淆“==”和“is”的原因。

在深入讨论之前,我想先举几个“==” 和 “is”的用例:

>>>a=5

>>>b=5

>>>a== bTrue>>>a is b

True

简单吧?a== b 和 a is b 都能返回 True。下一个例子:

>>>a=1000

>>>b=1000

>>>a== bTrue>>>a is b

False

这是为什么?第二个例子与第一个唯一的不同就在于a和b的值从5变成了1000,但是“==” 和 “is”输出的结果却完全不同。再看下一例:

>>>a= []

>>>b= []>>>a== bTrue>>>a is b

False

如果这还不够震惊,再看最后一个例子:

>>>a=1000

>>>b=1000

>>>a== bTrue>>>a is b

False>>>a=b>>>a== bTrue>>>a is b

True

“==”的正式运算是相等,而“is”的运算是标识。用“==”是比较两个对象的值。“a == b”应解释为“a的值是否等于b的值”。在上述所有示例中,a的值始终等于b的值(即使对于空列的示例也是如此),因此“a == b”始终为真。

在解释标识的概念之前,我需要先介绍一下id函数。对象的标识可以通过id函数来获得。一个对象的标识始终是唯一且恒定的,你可以将其视为该对象的地址。如果两个对象的标识相同,则它们的值也一定相同。

>>>id(a)

2047616

运算符“is”用于比较两个对象的标识是否相同,“a is b”就表示“a的标识与b的标识相同”。

图源:unsplash

现在你知道了“==”和“is”的真正含义,我们就可以开始深入讨论上述示例。

首先是第一例和第二例的结果差异。因为Python存储了一个介于-5到256之间的整数数组列表,每一个整数都有固定的对应标识。当你在此范围内分配整数变量时,Python就会将此变量作为数组列里的整数为其分配标识。

因此,在第一例中,由于a和b的标识都是从数组列表中获得的,所以他们的标识当然相同,因此a is b为真。

>>>a=5

>>>id(a)

1450375152

>>>b=5

>>>id(b)

1450375152

但一旦变量的值不在这个区间范围内,由于Python内部没有对应该值的对象,因此Python将为此变量创建新的标识,并为这个变量赋值。

如前所述,每个创建的标识都是唯一的,因此即使两个变量的值相同,他们的标识也永远不会等同。这就是为什么第二例中的a is b返回False。

>>>a=1000

>>>id(a)

12728608

>>>b=1000

>>>id(b)

13620208

另外,假设你打开的是两个控制台,如果该值仍在区间内,也能得到相同标识。但是,如果该值不在区间内,结果当然就不同了。

一旦理解了第一例和第二例的区别,就很容易理解第三例的结果了。由于Python不存储“空列表”对象,所以Python创建了一个新对象并赋值“空列表”。无论这两个列表是空还是元素相同,结果都是一样的。

>>>a= [1,10,100,1000]

>>>b= [1,10,100,1000]

>>>a== bTrue>>>a is bFalse>>>id(a)

12578024

>>>id(b)

12578056

来看最后一例。第二例与最后一例的唯一区别在于多了一行代码a = b。然而,这行代码却改变了变量a的命运。下面的结果将阐述原因:

>>>a=1000

>>>b=2000

>>>id(a)

2047616

>>>id(b)

5034992

>>>a=b>>>id(a)

5034992

>>>id(b)

5034992

>>>a2000>>>b2000

可以看到,在a= b之后,a的标识变成了b的标识。a = b把b的标识赋予了a。因此a和b就拥有了相同的标识,a的值现在就等于b的值,即2000。

最后一例传达出一个重要信息,即你可能在不经意间更改了对象的值,尤其是当对象为列表时。

>>>a= [1,2,3]

>>>id(a)

5237992

>>>b=a

>>>id(b)

5237992

>>>a.append(4)

>>>a

[1, 2, 3, 4]

>>>b

[1, 2, 3, 4]

从上例可以看出,a和b拥有相同的标识,他们的值就一定相同。因此在为a附加了一个新元素后,b的值也会受到影响。为了避免这种情况,如果要把一个对象的值复制到另一对象,又不引用同一标识,一个方法是在copy模块中使用deepcopy。对于列表,你还可以通过b= a[:]来实现。

>>>import copy

>>>a= [1,2,3]

>>>b=copy.deepcopy(a)

>>>id(a)

39785256

>>>id(b)

5237992

使用[:]把元素复制到新变量:

>>>a= [1,2,3]

>>>id(a)

39785256

>>>b=a[:]

>>>id(b)

23850216

>>>a.append(4)

>>>a

[1, 2, 3, 4]

>>>b

[1, 2, 3]

希望这篇文章能帮你彻底解决这个问题,不要再被相同的难题困住啦。

【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Python 3代码,实现了三个人玩石头剪刀布游戏: ```python import random # 定义游戏规则 rules = {'rock': 'scissors', 'scissors': 'paper', 'paper': 'rock'} # 定义玩家列表 players = ['Player 1', 'Player 2', 'Player 3'] # 定义游戏次数 rounds = 3 # 开始游戏 for i in range(rounds): print('Round', i+1) for player in players: # 玩家输入选择 choice = input(player + ', please choose rock, scissors or paper: ') # 电脑随机选择 computer_choice = random.choice(['rock', 'scissors', 'paper']) # 判断胜负 if choice == computer_choice: print(player, 'chose', choice, 'and computer chose', computer_choice, ', it is a tie!') elif rules[choice] == computer_choice: print(player, 'chose', choice, 'and computer chose', computer_choice, ',', player, 'wins!') else: print(player, 'chose', choice, 'and computer chose', computer_choice, ', computer wins!') ``` 代码解释: 1. `rules`定义了游戏规则,即`'rock'`胜过`'scissors'`,`'scissors'`胜过`'paper'`,`'paper'`胜过`'rock'`。 2. `players`定义了玩家列表,本例有三个玩家。 3. `rounds`定义了游戏次数,本例为三次。 4. 在游戏开始前,使用`for`循环遍历每一轮游戏,使用`for`循环遍历每一个玩家。 5. 玩家使用`input`函数输入自己的选择,电脑使用`random.choice`函数随机选择。 6. 判断胜负,如果玩家和电脑选择相同,则平局;如果玩家的选择胜过电脑的选择,则玩家获胜;否则,电脑获胜。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值