看代码:
a = 1 # 初始化变量a,赋值为1
b = a # 变量b被赋值为变量a的值,此时b的值也为1
b = 2 # 变量b被重新赋值为2
print(a) # 打印变量a的值
执行过程如下:
a = 1
:变量a被赋值为1。b = a
:变量b被赋值为变量a的值,即1。b = 2
:变量b被重新赋值为2,覆盖了之前a的值。print(a)
:打印变量a的值,此时a的值仍然是1,因为它没有被重新赋值。
再看:
a = [1] # 初始化变量a,赋值为包含一个元素1的列表
b = a # 变量b被赋值为变量a的引用,即指向相同的列表对象
b[0] = 2 # 通过变量b修改列表的第一个元素为2
print(a) # 打印变量a引用的列表
执行过程如下:
a = [1]
:变量a被赋值为一个包含一个元素1的列表。b = a
:变量b被赋值为变量a的引用,即它们指向相同的列表对象。b[0] = 2
:通过变量b修改了列表的第一个元素为2。由于a和b引用的是同一个列表对象,因此a的内容也会被修改。print(a)
:打印变量a引用的列表,此时列表的第一个元素已经变成了2。
因此,最终的输出结果是:
[2]
这是因为列表是可变对象,当你通过一个引用修改了列表的内容时,所有指向该列表的引用都会反映出这些修改。
利用这个原理,可以灵活实现一些功能。比如,字典或者JSON数据,我们有时候需要修改字典的值,如果字典的结构层次很深,修改起来就很繁琐。如果直接将字典的值定义为变量,通过修改变量直接修改字典的值就会很方便。
字典的demo:
dict1 = {'person': {'name': {'tom': {'phone number': {'first number': '123456','second number': '234567'}},'jack': {'phone number': {'first number': '666666','second number': '888888'}}}}}
dict1['person']['name']['tom']['phone number']['first number'] = '999999'
在这个代码中,对字典的一个值的修改很不简洁。那么如果定义一个变量到字典的值呢?
dict1 = {'person': {'name': {'tom': {'phone number': {'first number': '123456','second number': '234567'}},'jack': {'phone number': {'first number': '666666','second number': '888888'}}}}}tom_num_1 = dict1['person']['name']['tom']['phone number']['first number']
tom_num_1 = '999999'print(dict1) # 输出:{'person': {'name': {'tom': {'phone number': {'first number': '123456', 'second number': '234567'}}, 'jack': {'phone number': {'first number': '666666', 'second number': '888888'}}}}}
并没有实现预期的功能,原因与文章开头的第一段代码相同,变量只是被重新赋值,无法将变量的改变传递到字典的值。
再来:
dict1 = {'person': {'name': {'tom': {'phone number': {'first number': ['123456'],'second number': ['234567']}},'jack': {'phone number': {'first number': ['666666'],'second number': ['888888']}}}}}tom_num_1 = dict1['person']['name']['tom']['phone number']['first number']
tom_num_1[0] = '999999'
print(dict1) # 输出:{'person': {'name': {'tom': {'phone number': {'first number': ['999999'], 'second number': ['234567']}}, 'jack': {'phone number': {'first number': ['666666'], 'second number': ['888888']}}}}}
由于变量和字典的值同时指向了同一个列表,这是因为列表是可变对象,当你通过变量修改了列表的内容时,所有指向该列表的引用都会反映出这些修改,字典的值得到了预期的修改。
json的demo:
原始json文件的内容如下:
{
"person": {
"name": {
"tom": {
"phone number": {
"first number": ["123456"],
"second number": ["234567"]
}
},
"jack": {
"phone number": {
"first number": ["666666"],
"second number": ["888888"]
}
}
}
}
}
# encoding: utf-8
import jsonwith open('../JSON/setting.json', 'r', encoding='utf-8') as file:json_data = json.load(file)print(json.dumps(json_data, indent=4))tom = json_data["person"]["name"]["tom"] # 定义变量
tom_1st_phone = tom["phone number"]["first number"] # 定义变量
print(tom_1st_phone)
tom_1st_phone[0] = '000000' # 改变变量
print(json.dumps(json_data, indent=4))with open('../JSON/setting.json', 'w') as file: # 保存文件json.dump(json_data, file, indent=4)
执行结果:
{"person": {"name": {"tom": {"phone number": {"first number": ["123456"],"second number": ["234567"]}},"jack": {"phone number": {"first number": ["666666"],"second number": ["888888"]}}}}
}
['123456']
{"person": {"name": {"tom": {"phone number": {"first number": ["000000"],"second number": ["234567"]}},"jack": {"phone number": {"first number": ["666666"],"second number": ["888888"]}}}}
}