码迷,mamicode.com
首页 > 编程语言 > 详细

Python3参数传递-忒恶心了吧

时间:2020-04-27 13:53:10      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:基础   连续   加法   python   不可变对象   基础上   一个   传递   str   

Python参数传递情况没有我想的那么简单。不是非黑即白。

 

1. 不可变对象

2. 可变对象

  (1) 增删

  (2) 加减

 

不可变对象需要解释?str int 这种,函数中的修改对外部无影响。

 

重点在可变对象如list这种.

def f(l):
  l.extend([ilovecxk, 123])
 
a = [phpno1]

f(a)
print(a) # [‘phpon1‘, ‘ilovecxk‘, 123]

 

这很简单,相信大家都懂,但下面才是关键


def f(l):
 l = l + [4] 

a
= [phpno1]
f(a)
print(a) # [‘phpno1‘]

为啥不是 [‘phpno1‘, 4] ?

 

鄙人才疏学浅,说不清楚,可能叙述有误,多见谅。

因为执行加法的时候创建了一个新的列表,使 l 指向了新的列表,改变了 l 的值

 

那为什么append,  extend可以改变 l 的值呢?

因为它是在原列表的基础上追加(内存空间连续?), l 还是指向的原来的列表。其实这里就有点像C++的指针了。

 

变量无类型, 对象有类型。l 是一个变量, 它指向了list。

但是它也可以指向函数,类, 其他的list。

所以终归来说还是地址和内存。。。。。。

 

实际上def f(l) 传进来的是一个地址, 并不在乎你的类型。

如果函数修改了这个内存地址内的值(eg extend,append...),那么是会影响外部的

l = [1,3,cxk]
print(id(l))    # 2875527776960
l.append(666)
print(id(l))    # 2875527776960

 

如果函数修改的不是这个内存地址内的值, 那么不会影响外部,而是创建了新的局部变量。 eg: l = l + [4], 

l = [1,3,cxk]
print(id(l))    # 1759618321856
l = l + [666]
print(id(l))    # 1759618322176

 

Python3参数传递-忒恶心了吧

标签:基础   连续   加法   python   不可变对象   基础上   一个   传递   str   

原文地址:https://www.cnblogs.com/CodeBeyond/p/12785911.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!