python的变量的引用与赋值的学习

 看代码:

a = 1  # 初始化变量a,赋值为1
b = a  # 变量b被赋值为变量a的值,此时b的值也为1
b = 2  # 变量b被重新赋值为2
print(a)  # 打印变量a的值

执行过程如下:

  1. a = 1:变量a被赋值为1。
  2. b = a:变量b被赋值为变量a的值,即1。
  3. b = 2:变量b被重新赋值为2,覆盖了之前a的值。
  4. print(a):打印变量a的值,此时a的值仍然是1,因为它没有被重新赋值。

再看:

a = [1]  # 初始化变量a,赋值为包含一个元素1的列表
b = a   # 变量b被赋值为变量a的引用,即指向相同的列表对象
b[0] = 2  # 通过变量b修改列表的第一个元素为2
print(a)  # 打印变量a引用的列表

执行过程如下:

  1. a = [1]:变量a被赋值为一个包含一个元素1的列表。
  2. b = a:变量b被赋值为变量a的引用,即它们指向相同的列表对象。
  3. b[0] = 2:通过变量b修改了列表的第一个元素为2。由于a和b引用的是同一个列表对象,因此a的内容也会被修改。
  4. 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 json
 
with 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"
                    ]
                }
            }
        }
    }
}

  • 17
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝海拓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值