x1 = 5
y1 = 5
x2 = 'Hello'
y2 = 'Hello'
x3 = [1,2,3]
y3 = [1,2,3]
print(x1 is y1)
print(x2 is y2)
print(x3 is y3)
输出
True
True
False
为什么python为y3分配一个不同的id,而不是x3。
这里x3和y3是列表,python对元组和字典也一样,我也想知道python在哪里有相同的行为将新的id分配给具有相同值的变量,为什么会这样?
答案 0 :(得分:4)
因为否则会发生这种情况:
var docsView = new google.picker.DocsView().
setIncludeFolders(true).
setSelectFolderEnabled(true);
var picker = new google.picker.PickerBuilder()
.enableFeature(google.picker.Feature.MINE_ONLY)
.enableFeature(google.picker.Feature.NAV_HIDDEN)
.setAppId(appId)
.setOAuthToken(oauthToken)
.setDeveloperKey(developerKey)
.addView(docsView)
.setCallback(pickerCallback)
.build();
picker.setVisible(true);
事实上,
x3 = [1,2,3]
y3 = [1,2,3]
x3[0] = "foo"
x3[0] == y3[0] // Does NOT happen!
这是一件好事™。如果x3[0] != y3[0]
和x3
相同,那么更改另一个也会改变另一个。这通常没有被发现。
另请参阅when does Python allocate new memory for identical strings?为什么字符串的行为不同。
另外,如果您想比较值,请使用y3
。
答案 1 :(得分:3)
Tichodroma说得很好。但是,如果你想为列表,dicts等提供相同的id()
(如果你想为同一个对象设置不同的名称),那么你可以这样做:
>>> x3 = y3 = [1,2,3]
>>> print(x3 is y3)
True
在这种情况下,x3和y3在内存中引用相同的列表对象。所以,如果你改变其中任何一个,另一个将会改变。
>>> x3[1] = 10
>>> y3
[1, 10, 3]
>>> x3
[1, 10, 3]
如果整数值相同,则它们并不总是具有相同的id
。看看here。
当前实现为所有实体保留了一个整数对象数组 -5到256之间的整数,当你在该范围内创建一个int时 实际上只是返回对现有对象的引用。
测试:
>>> n = 256
>>> m = 256
>>> n is m
True
>>> n = 257
>>> m = 257
>>> n is m
False
>>>
另一个有趣的测试(去图!):
>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False
P.S。:我正在运行python 3.4。而文档中的引用是针对python 2.7的(我没有找到python 3.4的等价物)。但我仍然在python 3.4中获得类似的输出我正在运行。所以对于python 2.7来说,当前实现似乎对python 3.4仍然有效。