def calc1(numbers):
sum = 0
for num in numbers:
num=num+2
nums = [1, 2, 3]
calc1(nums)
print(nums) #输出结果是[1,2,3]
问题:为什么不是[3,4,5]
python的语言特点吧……变量即为引用,引用和对象分离。要在原列表上改变列表中某个元素的值,只能使用 nums[0]=3这种形式,而不能把元素数值单独取出进行加减计算。
def calc1(numbers):
print(2,id(numbers[0]),type(numbers[0]))
print(2,id(numbers[1]),type(numbers[1]))
print(2,id(numbers[2]),type(numbers[2]))
print(2,id(numbers),type(numbers))
for num in numbers:
print(3,id(num),type(num))
num = 100
print(4,id(num),type(num))
nums = [1, 2, 3]
print(1,id(nums[0]),type(nums[0]))
print(1,id(nums[1]),type(nums[1]))
print(1,id(nums[2]),type(nums[2]))
print(1,id(nums),type(nums))
calc1(nums)
print(nums) #输出结果是[1,2,3]
print(id(1),type(1))
print(id(2),type(2))
print(id(3),type(3))
print(id(100),type(100))
1 8791580533584 <class 'int'>
1 8791580533616 <class 'int'>
1 8791580533648 <class 'int'>
1 30171784 <class 'list'>
2 8791580533584 <class 'int'>
2 8791580533616 <class 'int'>
2 8791580533648 <class 'int'>
2 30171784 <class 'list'>
3 8791580533584 <class 'int'>
4 8791580536752 <class 'int'>
3 8791580533616 <class 'int'>
4 8791580536752 <class 'int'>
3 8791580533648 <class 'int'>
4 8791580536752 <class 'int'>
[1, 2, 3]
8791580533584 <class 'int'>
8791580533616 <class 'int'>
8791580533648 <class 'int'>
8791580536752 <class 'int'>
首先python中常量的地址是分配好了的。比如上面代码中id(1),jiu一直是8791580533584。
再就是你在给num=num+2这个过程中,看上面代码的分析:
在传入前nums[0]的值是1,地址是8791580533584
在传入形参后numbers[0]的值还是1,地址是8791580533584
在进入第一次循环,num的值是1,地址不变是8791580533584.
你是不是觉得这3个变量代表的是同一个变量?所以num=num+2后,方法外的列表也应该发生改变?这是不对的,因为他们里面的值是1,而1的地址是8791580533584,这才是原因。
在for循环中第一次我进行了num = 100赋值操作。再看num的地址变成了8791580536752,而这恰好是100的地址。
所有,你在进行num=num+2操作是,先是计算num+2比如说等于3,再把3的地址给num。而num代表的一个新新的变量,而实参与形参中的numbers[0]和num[0]才表示的同一个,你看他们的地址都是30171784,这个地址才是引用的地址,一个改变另一个也会改变
for num in numbers这句话中,num就已经是一个新的变量了,后面的赋值也是对这个新变量进行赋值
通常的做法是重新建一个list:
numbers = [i+2 for i in numbers]