Python 学习之一: 变量名及赋值操作的本质

本文解释了Python中变量与内存的关系,通过实例说明了变量赋值实际上是在改变变量名指向的内存位置,而不是直接修改内存中的值。进一步揭示了Python如何处理内存中未被引用的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python 中的变量名有些类似于C++中的指针的概念.

python 中的赋值操作改变的并不是内存中变量的值, 而是变量名指向的变量.

>>> var = 3
>>> tmp = var
>>> var
3
>>> tmp
3
>>> id(var)
10417272
>>> id(tmp)
10417272
>>> id(3)
10417272


>>> var = 4
>>> id(var)
10417260
>>> id(4)
10417260
>>> id(tmp)
10417272

>>> tmp
3

>>> var
4
>>>

上边的例子指出, 当执行 "var = 3" 时, python会在内存中分配一块空间, 把"3"赋值给这块空间.

然后, 将变量名 "var" 关联到分配的内存.

当执行 "var = 4" 时, python 会再分配一块内存并存入"4", 然后将变量名 "var" 关联到"4" 所在内存.

此时"3"所在的内存并没有变化.


对应的操作是:

>>> var = 3

分配内存编号10417272, 存入"3"

将"var" 关联到 10417272

>>> var = 4

分配内存编号10417260, 存入"4"

将"var" 关联到 10417260

>>> tmp
3

>>> id(tmp)
10417272

此时10417272中的内容没有破坏, 仍然是"3", 并且"tmp"仍然指向10417272


事实上,当没有任何变量名指向一个内存中的变量市, python将释放该内存变量



<think>我们正在讨论的是如何通过变量名指向已定义的变量。在Python中,这通常指的是通过字符串形式的变量名来访问或操作变量。这种需求常见于动态编程场景,例如,当变量名在运行时确定时。Python提供了几种方法来实现通过变量名访问已定义的变量:1.使用内置函数`locals()`和`globals()`,它们分别返回当前作用域的局部变量和全局变量的字典。2.使用`exec`函数,它可以执行字符串形式的Python代码。3.使用`eval`函数,它可以计算字符串形式的表达式并返回结果。但是,请注意,使用`exec`和`eval`需要特别小心,因为它们可能带来安全风险(例如,如果字符串来自不可信的输入,则可能执行恶意代码)。外,在大多数情况下,使用字典(例如,用字典来存储变量)可能是更安全、更清晰的选择。下面我将详细说明每种方法:方法1:使用`globals()`和`locals()`在全局作用域中,我们可以通过`globals()`函数获取全局变量的字典,然后通过变量名字符串来访问变量。在局部作用域中,可以使用`locals()`,但注意在函数内部修改局部变量并不可靠(因为Python对局部变量的优化)。示例:假设在全局作用域中有变量`x=10`,我们可以这样获取:```pythonx=10var_name='x'value=globals()[var_name]print(value)#输出10```方法2:使用`eval``eval`函数将字符串作为表达式来求值。因此,我们可以构造一个字符串,该字符串就是变量名,然后`eval`会返回该变量的值。示例:```pythonx=10var_name='x'value=eval(var_name)print(value)#输出10```注意:`eval`也可以计算更复杂的表达式,如`eval('x+1')`会得到11。方法3:使用`exec``exec`用于执行存储在字符串中的Python代码。它不会返回值,但我们可以通过传递一个字典作为参数来存储变量。示例:```pythonx=10var_name='x'#使用exec来执行赋值操作,或者获取值。但要获取值,我们需要指定一个字典来存放结果。#通常,我们可能用exec来修改变量,而获取值则用上面的方法更简单。#下面是一个通过exec获取变量值的例子(不推荐,因为更麻烦):exec('result='+var_name)print(result)#这里会打印10,但是要注意,这里exec执行后,在全局作用域中创建了一个变量result。#更安全的方式是传递一个字典作为命名空间:namespace={}exec('result='+var_name,globals(),namespace)print(namespace['result'])```然而,对于仅仅获取一个变量的值,使用`globals()`或`locals()`或者`eval`更直接。注意:在函数内部,如果你想修改局部变量使用`locals()`可能不会生效,因为Python对局部变量的优化机制。在这种情况下,可以使用`nonlocal`或全局变量,或者使用字典来存储变量外,还有一种常见的情况是,我们可能想通过字符串来设置变量的值。我们可以使用:```pythonx=10var_name='x'globals()[var_name]=20print(x)#输出20```但是,这种方法在局部作用域内修改局部变量时,使用`locals()`可能不会成功。所以,在函数内部,我们通常避免通过字符串来修改局部变量。推荐的安全方法:使用字典如果你需要动态访问变量,那么一开始就使用字典可能是更好的设计。例如:```pythonmy_vars={'x':10,'y':20}var_name='x'print(my_vars[var_name])#输出10#修改my_vars[var_name]=20```这种方法既安全又易于维护。总结:1.在全局作用域中,使用`globals()`访问全局变量。2.在局部作用域中,尽量避免使用`locals()`来修改变量。3.使用`eval`和`exec`时需谨慎,尤其是在处理用户输入时。4.更安全的方式是使用字典来存储动态变量。现在,我们根据要求,生成相关问题。</think> 在Python中,变量名本质上是指向内存中对象的标识符。可以通过以下方法实现变量名指向已定义变量: ### 方法1:直接赋值(最基本方式) ```python # 定义原始变量 original_var = 42 # 创建新变量名指向同一对象 new_var = original_var # 验证两个变量指向同一对象 print(id(original_var) == id(new_var)) # 输出 True [^2] ``` ### 方法2:使用字典实现动态映射 ```python # 定义变量字典 variables = { 'age': 25, 'name': '张三' } # 动态创建指向已定义值的新变量 city_ref = 'city' # 新变量名 variables[city_ref] = '北京' # 访问所有变量 print(variables['name']) # 输出: 张三 print(variables[city_ref]) # 输出: 北京 [^3] ``` ### 方法3:`globals()`动态绑定全局变量 ```python # 定义全局变量 global_var = 100 # 创建新变量名指向全局变量 var_name = "global_ref" globals()[var_name] = global_var # 动态绑定 # 验证 print(global_ref) # 输出: 100 print(id(global_var) == id(global_ref)) # 输出: True [^1][^4] ``` ### 方法4:`locals()`绑定局部变量 ```python def test(): local_var = "局部值" loc_ref = "local_ref" # 动态创建局部引用 locals()[loc_ref] = local_var print(local_ref) # 输出: 局部值 [^3] test() ``` ### 关键概念说明 1. **变量本质**:变量名实质是内存对象的标签 $$ \text{变量名} \xrightarrow{\text{引用}} \text{内存对象} $$ 2. **标识符检查**:使用 `id()` 验证两个变量是否指向同一对象 3. **类型灵活性**:Python允许变量名随时指向新类型对象 ```python dynamic_ref = 3.14 # 指向浮点数 dynamic_ref = "文本" # 改为指向字符串 [^1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值