Python 字典创建与赋值引用机制详解

桃夭
桃夭
发布时间:2026-10-13 | 3人浏览过
原创

本文详细解析Python中字典的多种创建方式,对比直接赋值、dict构造函数及fromkeys方法的适用场景。重点探讨Python变量赋值时的引用机制,通过列表操作实例阐明“=”与“+=”在内存地址指向上的差异,帮助开发者避免常见的引用陷阱。

近期在处理大型数据库相关项目时,需要实现基于数值的查找功能,因此考虑使用Python中的字典(dict)结构,此前对该数据结构的使用经验较少。

日常开发中,列表(list)和元组(tuple)是更为常用的数据结构,网络上关于它们的使用教程也非常丰富。

查阅资料后,了解到创建字典主要有以下几种方法:

第一种方法:

dict = {'name': 'earth', 'port': 80}

第二种方法:

fdict = dict((['x', 1], ['y', 2]))

第三种方法:

ddict = {}.fromkeys(('x', 'y'), -1)

对上述方法进行了实际测试,发现均难以直接满足需求。由于数据库查询返回的结果类型为元组(tuple),且元组不可变,使用第二种方法时必须先将内部元素转换为列表(list)。

在此补充说明元组与列表相互转换的方法:将列表转为元组可使用 l=tuple(l),将元组转为列表可使用 l = list(l)。

在练习过程中,偶然发现了一种更简便的构建方式:首先声明一个空字典。

fdict= {}

随后通过键值对赋值的方式逐步添加元素。

fdict[keys] = values

接着在循环中重复执行该赋值语句,即可将结果逐个添加至fdict中而不会发生覆盖。此前曾误以为新赋值会直接覆盖原有键值,实际并非如此。

利用这种方法,可以高效地将查询结果转换为所需的键值对格式。

在Python中,变量赋值实际上传递的是对象的内存地址(引用):

示例如下:

a = [1,2,3,4]

b = a

a.append(1)

print a

print b

运行结果显示,两个变量的输出均为:[1,2,3,4,1]。

这表明在Python中,当一个变量赋值给另一个变量时,传递的是内存地址。因此,当变量a指向的内容发生变化时,由于变量b指向的是与a相同的内存地址,其输出结果也会随之改变。

与a的输出结果保持一致。

进一步实验:

a = [1,2,3,4]

b = a

a += [1] #在列表尾部追加一个元素

print a

print b

观察到的结果为:

[1, 2, 3, 4, 1]

[1, 2, 3, 4, 1]

这一结果符合前述解释,因为+=操作是在a指向的原地址上进行修改,所以b的输出也反映了这一变化。

再看下一个对比实验:

a = [1,2,3,4]

b = a

a = a + [1] #在尾部追加一个元素并重新赋值

print a

print b

读者可以尝试运行此段代码以验证结果。

实际运行结果为:

[1,2,3,4,1]

[1,2,3,4]

这是为什么呢?

为什么使用+=运算符与分开相加后赋值的结果存在差异?

经过查阅相关资料,确认以下解释:

当执行 a = a+[1] 时,系统会先将 a + [1] 的计算结果存储在一个新的内存地址c中,然后将变量a的指向更新为这个新地址c。因此,输出a时得到的是包含新元素的结果。

然而,变量b仍然指向原来的内存地址,该地址中的值并未发生变化,因此b输出的结果仍为原列表内容,这可能会让人感到意外。

相比之下,+=操作符是在a指向的原地址上进行原地修改,因此b也会反映出这一变化。

总结:在Python中,使用“=”进行变量赋值时,传递的是内存地址指针而非值本身。开发者需谨慎操作,避免因引用共享而引发潜在bug。

以上关于Python字典创建及赋值引用机制的实例解析到此结束,希望能为读者提供参考,欢迎继续支持本站获取更多技术分享。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表