Python 字典创建与赋值引用机制详解
本文详细解析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字典创建及赋值引用机制的实例解析到此结束,希望能为读者提供参考,欢迎继续支持本站获取更多技术分享。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









