变量的引用
在python中,所有的变量都是指向地址,变量本身不保存数据,而是保存数据在内存中的地址。我们用下面的程序来理解:
a = 10
print(id(a))
a = 11
print(id(a))
(利用id( )方法查看数据的地址)
输出结果为:
可以发现:修改变量的值,变量保存的地址随之改变。
python中:
- 变量和数据是分开存储的
- 变量 中保存着数据在内存中的地址
我们把变量中记录数据的地址的行为,叫做 引用。
通俗的来说,在 Python
中,变量的名字类似于 便签纸 贴在 数据 上。
再看一段代码:
a = 10
print(id(a))
b = a
print(id(b))
c = 10
print(id(c))
d = 11
print(id(d))
结果如下:
从上面运行结果中,我们可以知道:
1.b=a是地址传递
2.声明一个变量时,如果内存中已经有变量要保存的内容了,会将该变量指向内存中原有内容的地址,如果内存中没有变量要保存的内容,就会在内存中开辟一块新的空间用来保存变量要保存的内容。
函数的参数和返回值的传递
我们通过一个程序来弄清楚函数的参数和返回值的传递方式是地址传递还是值传递。
def test(num):
print("-" * 40)
print("%d 在函数内的内存地址是 %x" % (num, id(num))) # 说明函数的参数传递时地址传递 result = 100 print("返回值 %d 在内存中的地址是 %x" % (result, id(result)))
print("-" * 40) return result a = 10
print("调用函数前,变量a引用的地址是 %x" % id(a)) r = test(a) print("调用函数时,实参内存地址是 %x" % id(a))
print("调用函数后,返回值内存地址是 %x" % id(r)) # 说明return返回值是地址传递
运行结果如下:
通过上面程序:
- 我们发现变量a以及将a传给函数的参数num的地址都是一致的,说明函数的参数传递是地址传递。
- 函数中result变量和接受返回值的r变量的地址是相同的,说明函数中的返回值传递也是地址传递