刚开始学习Python,我遇到了一个对我来说并不明显的现象。
当用字典变量填充字典的值时,结果发现改变这个变量后,字典中的值也改变了。
var_dict_value = {'one' : 1, 'two' : 2}
var_dict = {}
var_dict ['first'] = var_dict_value
print(var_dict)
# {'first': {'one': 1, 'two': 2}}
print('chg var_dict_value to 7777')
var_dict_value['one'] = 7777
print(var_dict)
# {'first': {'one': 7777, 'two': 2}}
由此我可以得出结论,当引用一个变量时,我们不是使用它的值,而是将它作为指向值的指针(我在某个地方听到过关于如何在Python中一切都是对象的巧妙说法,但这并不意味着任何事情)对我来说他没有说)。
但是普通变量(不是字典)的类似情况给出了不同的效果 - 在更改其定义中涉及的变量后,变量的值不会改变
a = 5
b = a
print(f'a = {a}, b = {b}')
# a = 5, b = 5
a = 10
print(f'a = {a}, b = {b}')
# a = 10, b = 5
因此问题是:
- 这两种情况的根本区别是什么?为什么在第一种情况下,值(在字典中)在更改变量后发生变化,但在第二种情况下 - 不是
- 在字典的情况下如何“常量”一个值?即如何保证当var_dict_value改变时,var_dict中的数据不改变?
我将尝试用这个例子来解释
在前两行中,您定义了引用同一对象的两个变量。
接下来,修改变量
a,这实际上意味着在内存中创建一个新对象并将a对其的引用放入变量中。因此,对5字符串后面的int 值的引用a = 10仅存储在变量 中b。当您打印最后一行中的值时,您会看到这一点。在这个例子中
实体
var_dict ['first']和var_dict_value引用内存中的同一个对象。如果您更改其中任何一个,您将看到其他的更改示例次数
例子二
这里的区别在于字典是可变数据类型,但
int不是可变数据类型。如果更深入,您可以理解字典键下的变量也是不可更改的,并且当被覆盖时,还会在内存中创建一个新对象以及指向它的链接,该对象将位于字典键下 =) 和旧对象将在最后一次更改后被销毁(int 值
1和2),因为没有链接会导致这些对象为了避免上述更改,您必须使用
copy()和方法deepcopy()。可以在文档中阅读差异。短的
copy()- 创建一个新对象,然后(尽可能检查“多少”是值得的)在其中插入对原始对象中找到的对象的引用。deepcopy()- 创建一个新对象,然后递归地将在原始对象中找到的对象的副本插入其中。PS:可通过引用访问的可变对象可以更改,并且没有机制可以阻止这种情况。程序员有责任使用正确的数据类型并确保它们得到正确的处理