python 函数参数传递

终于找到了困惑已久的问题答案。最近在使用 python 做开发,碰到了一个有关模块共享的问题,今天写下心得。

 

python 是弱类型的编程语言,变量在定义的时候不需要指定类型,这点不像 C/JAVA 等,PYTHON变量可以是任何类型,由于 python 具有 GC 机制,因此 python 中 会有一个与 C 不同的行为,在C 语言中一旦变量被定义,那么它所指向的内存地址在程序运行过程中是不会变化的,使用者可以通过直接修改变量所指向内存的内容来改变变量的值。但是这点在 python 中是行不通的,使用者是不能修改变量(其实是常量)中的内容。例如下面的代码:

a = 22
a = 23

a = 22 会在堆中创建 int 类型的对象 并赋值 22,并且让a 指向 22 这个对象,当执行a = 23 的时候,其实并不是修改 22 为23, 而是重新在堆中创建,然后让 a 指向23,相当于重新定义。可通过下面的方法验证。

>>> a = 22
>>> id(a)
>>>29778640L
>>> a = 23
>>> id(a)
>>>29778616L

可以看出 a 的两次 id 都不同即 两次对a 的赋值使得 a 指向了不同的内存块。

现在来看看参数传递。

函数参数传递:

  python 函数参数传递的都是引用,而不是值。

def test(x):
    print(id(x))

a = 22
test(a)

当把 a 传递给 test 函数的时候,其实是将 a 所指向的内存块的地址传给 x,因此 a 和 x 的 id 都是一样的。

>>> def test(x):
      print(id(x))
>>> a = 22
>>> id(a)
>>>29778640L
>>> test(a)
>>>29778640

如果在 test 函数中修改 x 的值,是不会影响到函数外 a 的值的,a 不是一个可以被共享的引用,下面的代码可以修改 a 中的值。

def test(x=[]):
    x[0] = 1
    print(id(x))
a = [2, ]
test(a)

 修改前后 a 和 x 的 id 值是一样的,因为 a 和 x 指向同一块内存,列表是可共享引用的。在将 a 传递给 test 函数的过程中其实也是将 a 指向的内存地址传递给 x,一旦在 test 函数内部对 x 重新赋值, 那么 x 和 a 就指向不同的内存对象了。同样的道理,修改列表中的值,是让列表中被修改的元素指向了新的元素。

模块参数传递:

  在传递参数的行为上,模块和函数具有相同的行为。

#a.py
test = 1

#b.py
from a import test
# test = 1
print(test)
test = 2#不会影响 a.py 中 test 的值

执行了from * import 后,会在 b.py 中创建 test 变量,并使得 test 指向 a.py 中 test 所指向的内存,因此一旦 在 b.py 中对 test 进行操作,那么 a.py 和 b.py 中的两个 test 就截然不同了。

要想在多个模块中共享变量,需要将被共享的变量变为可被共享的,即 list 或 dict 等。

转载于:https://www.cnblogs.com/zhaifly/p/5333566.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值