bit*_*ack 2 python dictionary python-3.x
我来自C,学习Python.在Python(3.5.2)中,似乎将一种数据类型分配给同一类型的另一种数据类型有时通过值来完成,有时通过引用来完成.
例如,字符串按值分配:
>>> str1 = "hello"
>>> str2 = str1
>>> print(str1, str2)
hello hello
>>> str2 = "goodbye"
>>> print(str1, str2)
hello goodbye
Run Code Online (Sandbox Code Playgroud)
这是我期望的行为.但是,它与字典的工作方式不同:
>>> dict1 = {'key1':'val1', 'key2':'val2'}
>>> dict2 = dict1
>>> print(dict1, dict2)
{'key2': 'val2', 'key1': 'val1'} {'key2': 'val2', 'key1': 'val1'}
>>> dict2['key1'] = 'newval'
>>> print(dict1, dict2)
{'key2': 'val2', 'key1': 'newval'} {'key2': 'val2', 'key1': 'newval'}
Run Code Online (Sandbox Code Playgroud)
请注意,两个dict1 和 dict2发生了变化.同样,如果我将键/值对添加到其中一个词典中,它将同时出现在两个词典中.哎呀!
(对不起,这是我的C-background讲话):)
我如何知道任何给定变量类型的行为?有这种疯狂的方法还是我只需要记住任意规则?
PS我意识到我可以通过使用获得我预期的行为dict2 = dict(dict1).
在"可能重复"包含良好的信息如何做到这一点,但我感兴趣的是,为什么我不得不这样做.这个问题的答案已经非常有用了!
在Python中,一切都是通过引用; 但与C,Java不同,变量不是一个盒子.赋值是一种约束力.
str1 = "hello"
str2 = str1
Run Code Online (Sandbox Code Playgroud)
双方str1并str2提到"你好",但字符串Python是不变的,所以修改str2,将创建一个新的绑定,因此就没有影响的值str1
str2 = "hack"
# here str1 will still reference to "hello" object
Run Code Online (Sandbox Code Playgroud)
Dict是一样的:
d1 = {"name": "Tom"}
d2 = d1
Run Code Online (Sandbox Code Playgroud)
d2并且d1将引用相同的对象.如果设置d2为新值不会影响值d1; 但相反,如果我们只修改d2,那么d2['age'] = 20,d1因为它们共享同一个对象,所以会改变它们的值.
d2 = {"name": "Hack"}
# the value of d1 does not change
Run Code Online (Sandbox Code Playgroud)
Luciano Ramalho在Fluent Python中总结了它,第8章,Variables Are Not Boxes部分
要理解Python中的赋值,请始终首先阅读右侧:创建或检索对象的位置.之后,左边的变量绑定到对象,就像粘贴在它上面的标签一样.忘了盒子.
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |