当前位置: 首页 > 面试题库 >

在python字典中赋值(复制与参考)

司马俊晖
2023-03-14
问题内容

我知道在python中,任何东西,无论是数字,字符串,字典还是其他任何东西都是对象。变量名只是指向内存中的对象。现在根据这个问题,

>> a_dict = b_dict = c_dict = {}

这将创建一个空字典,并且所有变量都指向该dict对象。因此,更改任何一个都会反映在其他变量中。

>> a_dict["key"] = "value" #say
>> print a_dict
>> print b_dict
>> print c_dict

会给

{'key': value}
{'key': value}
{'key': value}

我已经了解了指向对象的变量的概念,因此这似乎很公平。

现在,尽管它很奇怪,但由于它是这样的基本声明,为什么会发生这种情况?

>> a = b = c = 1
>> a += 1
>> print a, b, c
2, 1, 1   # and not 2, 2, 2

问题的第一部分: 为什么这里不应用相同的概念?

实际上,当我尝试为此寻求解决方案时,就出现了这种疑问:

>> a_dict = {}
>> some_var = "old_value"
>> a_dict['key'] = some_var
>> some_var = "new_value"
>> print a_dict
{'key': 'old_value'}  # and not {'key': 'new_value'}

这似乎是违反直觉的,因为我一直以为我要告诉字典保存变量,并且更改变量指向的对象显然会反映在字典中。但这在我看来好像是在复制该值,而不是引用该值。
这是我不明白的第二件事。

继续前进,我尝试了其他事情

>> class some_class(object):
..    def __init__(self):
..        self.var = "old_value"
>> some_object = some_class()
>> a_dict = {}
>> a_dict['key'] = some_object
>> some_object.var = "new_value"
>> print a_dict['key'].var
"new_value"    # even though this was what i wanted and expected, it conflicts with the output in the previous code

现在,在这里,显然正在引用它。这些矛盾使我对python的不可预测的特性深感不安,尽管我仍然喜欢它,原因是我对其他任何语言都不甚了解:p。即使我一直以为分配会导致对象的引用,但是这两种情况是矛盾的。
所以这是我最后的疑问 。我知道这可能是那些python gotcha的 。请教育我。


问题答案:

您在这里尝试2种不同的方法。首先是 可变性不变性 的思想。在Python, ,,有一些相比内建不可变类型的,(以及其他),其是可变的类型。
不变 对象是一旦创建就无法更改的对象。因此,在您的示例中:str``int``tuple``list``dict __

a = b = c = 1

该行后,所有的abc指在内存中相同的整数(你可以打印他们的respecitve检查id的,并指出,它们是相同的)。但是,当您这样做时:

a += 1

a现在,它是指位于不同存储位置的新(不同)整数。请注意,作为约定,+=如果类型是不可变的,则应返回某事物的新实例。如果类型是 可变的
,则应在适当位置更改对象并返回它。我将在此答案中解释一些更具体的细节。

对于第二部分,您试图弄清楚python的标识符如何工作。我认为的方式是……编写语句时:

name = something

右侧被求值为某个对象(整数,字符串等)。该对象然后在左侧1上被命名。当名称在右侧时,将自动“查找”对应的对象,并在计算中替换该名称。请注意,在此框架中,赋值并不关心之前是否有任何名字,它只是用新的值覆盖了旧的值。以前使用该名称构造的对象看不到任何变化-
也不。它们已经被创建-保留对对象本身的引用,而不是对名称的引用。所以:

a = "foo"  # `a` is the name of the string "foo" 
b = {"bar": a}  # evaluate the new dictionary and name it `b`.  `a` is looked up and returns "foo" in this calculation
a = "bar"  # give the object "bar" the name `a` irrespecitve of what previously had that name

1为了简单起见,我在这里忽略了一些细节-例如,当您分配给list元素时会发生什么: lst[idx] = some_value * some_other_value



 类似资料:
  • 问题内容: 我有一个Python程序,可与字典配合使用。我必须复制字典数千次。我需要密钥和关联内容的副本。该副本将被编辑,并且不得链接到原始副本(例如,副本中的更改不得影响原始副本。) 键是字符串,值是整数(0/1)。 我目前使用一种简单的方法: 对我的代码进行性能分析表明,复制操作花费了大部分时间。 有没有更快的替代方法?什么是最快的? 问题答案: 查看Python操作的C源代码,您会发现它们做

  • 问题内容: 我有以下列表,其中包含重复的具有不同值的汽车注册号。我想将其转换为字典,该字典接受汽车登记号的多个键。 到目前为止,当我尝试将列表转换为字典时,它消除了键之一。如何制作具有重复键的字典? 清单是: 我试过的代码是: 问题答案: Python字典不支持重复键。一种解决方法是将列表或集合存储在字典中。 一种简单的方法是使用: 你要做的就是更换 与 你将获得一个列表字典。

  • 问题内容: 我正在尝试合并三个具有相同键,值列表或单个值的字典。 我需要将值中的所有项目添加到一个列表中。 我尝试了几种方法,但是大多数方法将值放入嵌套列表中。例如 我尝试通过遍历值来更新它: 但结果完全一样。我试图简单地添加列表,但是由于第三个字典只有一个浮点数,所以我做不到。 因此,我尝试首先以1和2的值添加列表,然后附加3的值。添加列表效果很好,但是当我尝试从第三个字典中添加浮点数时,突然整

  • 问题内容: 搜索一个值并获取父词典名称(键): 在以上字典中,我需要搜索类似的值:。其中,字典中没有任何值重复。如何搜索?因此它应该返回字典中的父键。 请注意 :解决方案应在 未修改的情况下 适用 于 Python 2.7和Python 3.3。 问题答案: 这是对嵌套dict的迭代遍历,还可以跟踪导致特定点的所有键。因此,一旦您在字典中找到正确的值,您就已经具有获取该值所需的键。 如果将以下代码

  • 很多从 Java、C 语言转向 Python 的程序员对 Python 中的赋值语句感到很神奇或者很困惑, Python 中赋值的特殊之处有 3 点特殊之处:出 0-127 的数字、部分字符串外都是引用赋值; 和其它支持函数式编程范式的语言一样,支持模式匹配;Python 支持连续赋值。 模式匹配 支持函数式编程范式的语言通常也支持模式匹配,例如在 Erlang 中我可以这样赋值: [Head |

  • 我正在查询一个API并从中提取我需要的数据。然后我想把它转换成熊猫数据帧,但不确定最好的方法是什么。我有一些有用但很复杂的东西。下面的示例数据是一个字典,但它实际上来自一个API,但它能够理解这一点。