【Python有坑系列】函数参数传递:传值?引用?

一、首先要说的是:变量 与 对象

在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解 是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。

类型是属于对象的,而不是变量。这样,很多问题就容易思考了。

例如: 

nfoo = 1   #一个指向int数据类型的nfoo(再次提醒,nfoo没有类型)

lstFoo = [1]   #一个指向list类型的lstFoo,这个list中包含一个整数1。

 

接着说例子好了:

def ChangeInt( a ):

      a = 10  # change the number

nfoo = 2 

ChangeInt(nfoo)

print nfoo #结果是2

这时发生了什么,有一个int对象2,和指向它的变量nfoo,当传递给ChangeInt的时候,按照传值的方式,复制了变量nfoo的值,这样,a就是nfoo指向同一个Int对象了,函数中a=10的时候,发生什么?

(还记得我上面讲到的那些概念么),int是不能更改的对象,于是,做了一个新的int对象,另a指向它(但是此时,被变量nfoo指向的对象,没有发生变化),于是在外面的感觉就是函数没有改变nfoo的值,看起来像C++中的传值方式。

def ChangeList( a ):

      a[0] = 10  # change the number

lstFoo = [2]

ChangeList(lstFoo )

print nfoo #结果是[10]

注:原文出处

二、点调用与参数传递

对象调用固有方法可以用点调用,自定义函数调用需要参数传递。

 

>>> testlist = [['1', '2009-03-02', 3.762146, -8],
['1', '2009-03-01', 3.758066, -8],
['1', '2009-01-03', 3.76085332653061, -8],
['0', '2009-12-28', 39.759765375, -104.984303125],
['0', '2009-12-27', 39.70999875, -104.95675168749999],
['0', '2009-12-24', 39.72202824, -104.96074968],
['0', '2009-12-23', 39.77230825, -105.0435074375],
['0', '2009-12-21', 39.77455175, -105.01426466666665],
['0', '2009-12-20', 39.76241472, -104.90343176000002],
['299', '2009-08-14', 29.894691, -81.314517],
['299', '2009-08-13', 29.894691000000005, -81.314517],
]
>>> testlist.listToClass()
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    testlist.listToClass()
AttributeError: 'list' object has no attribute 'listToClass'
>>> listToClass(testlist)

三、类元素可修改

虽然int 是不可更改的对象,作为类的属性时却可以更改。

紧跟上述代码

 

>>> def change_m1(nodelist):
	nodelist.m_1+=1

	
>>> change_m1(testlist[0])
>>> testlist[0].m_1
1

四、函数内做的列表整体修改该传递不出来,但是可以改变局部列表元素

 

>>> def changlist(list1,list2):
	list1 = [1,1]
	list2 = [2,2]	
>>> list1 =[5,6]
>>> list2=[]
>>> changlist(list1,list2)
>>> list1
[5, 6]
>>> list2
[]
>>> def changelist2(list1,list2):
	list1[0] = 1
	list2[0] = 2

	
>>> list1=[0,0,0]
>>> list2=[1,1,1]
>>> changelist2(list1,list2)
>>> list1
[1, 0, 0]
>>> list2
[2, 1, 1]

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值