重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
对于Python的初学者,在对象的使用过程中,由于对变量的赋值和对象的复制中的概念模糊,导致程序出错。
成都创新互联主要从事网站建设、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务嵊州,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
例如,下面的代码:
输出结果为:
a = [6,2,3,4,5],
b = [6,2,3,4,5],
c = [1,2,3,4,5]
a等于b?True
a等于c?True
a是b?True
a是c? False
可以看到,a,b, c所指向的对象的值都相同(a==b为True). a和b都是代表同一个对象(a is b为True)。当我们通过变量b对该列表进行修改时,由于a也指向该列表,所以当打印a,b时,我们得到相同的值。 而a和c则是代表不同的对象(a is c为False),所以修改b所指向得列表不会改变c梭子乡的列表的值.
在Python中,所有的变量都代表了对象,即便是简单的数字类型(int, float, bool),也是以对象的形式存在的。我们看下面的代码:
输出结果是:
a==b为True
a is b为True
可见,a, b都是指向同一个对象。接下来,进行下面的操作,
输出结果是:
a = 1, b = 2
a is b为False
与前面的列表不同,当我们对b做修改时,实际上是给b赋予了一个新生成的对象,对数值类型来说,所有的数值运算都会创建一个数值对象,并将这个对象指定给变量。因此,a与b指向了不同的对象,数值也不同。
再回过头来看列表对象,
我们知道,b是与a指向同一对象的变量,使用b对该对象进行修改,与使用a对该对象进行修改,效果是完全一样的。如果我们需要需要一个与a完全相同又与a相互独立的列表,那么就需要复制这个对象,也就是新建一个内容和源对象相同的对象。
对于列表来说,最简单的复制方法是通过下标索引的方式创建新的列表:
对于各种数据类型通用的对象拷贝复制,我们可以使用python内建的copy模块。
对于复杂对象(如嵌套列表)的复制,则需要注意区分浅拷贝和深拷贝。我们来看下面的代码:
得到的结果是:
a[0] is b[0]为 True
a[0] is c[0]为 False
a = [[-1, 2, 3], [4, 5, 6]]
b = [[-1, 2, 3], [7, 8, 9]]
c = [[1, 2, 3], [4, 5, 6]]
a[1] is b[1]为False
从上面的代码我们可以看到,copy函数为浅拷贝,只拷贝了对象的外层,而对象内部所包含的对象仍然指向原有的对象。而deepcopy则为深拷贝,对象内部的对象也进行了复制。
以上我们对变量的赋值和对象的复制做了更加深入的分析。在具体的使用中,我们需要根据具体来决定使用赋值、浅拷贝、深拷贝。
params
就是(5, 5)
(5,) * 2 ,就是2个5的元组,乘号可以理解成相加。"*" * 30就是30个“*"的字符串
*params作为参数,前面的*号就是把params元组分解成元素的意思,这样就分开成为2个参数了。实际上传递给了x,y
于是就执行了power(5,5)
在python中,变量赋值的语法比较简单,语法就是 “变量名 = 对象”,由于python属于动态语音,所以不需要像c、 java那样在变量赋值时需要声明变量的类型。
c 变量赋值
int x = 1;
python 变量赋值
x = 1
y = "hello world!"
a = [1, 2]
b = ('a', 'b')
c = {"foo": "bar"}
python 变量赋值中,所涉及到的变量命名是有一定规则的:
1. 变量名只能包含字母、数字和下划线。变量名可以字母或下划线开头,但不能以数字开头,例如,可将变量命名为name_1,但不能将其命名为1_name
2. 变量名不能包含空格,但可使用下划线来分隔其中的单词。例如,变量名name_one可行,但变量名name one会引发错误。
3. 不要将Python关键字和函数名用作变量名,即不要使用Python保留用于特殊用途的单词,如not、pass等。
4. 变量名应既简短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好, 虽说简短好,但是不能依照自己的意愿随意简写,尽量使用大家约定俗成的简写,如果不是还不如写全拼。
5. python 变量名中大小写敏感,所以 NAME, Name, name 代表三个不同的表里名, 这里提一下就是慎用小写字母l和大写字母O,因给他们可能被人错看成数字1和0;
再说变量赋值中赋予给变量的值,python中万事皆对象,所以python中只要是对象就能给变量赋值。如:
x = 1 # x赋值为数字1;
x = sum # x赋值为内建求和函数sum;
python的赋值真实上说应该不是赋值,而更像是“引用”,如何理解“引用”呢,python中一直对象的生成是会在内存中分配给一个内存地址,这个内存地址可以使用id()方法去获取,然后在变量赋值时,将变量直接引用该对象的内存地址,进而完成变量赋值,如:
x = 1, 赋值时x直接引用1所在内存的地址, y = x, 此时是y直接引用x的所指向的内存地址
python中有判断变量的方法如 is() 和 ==,二者在判断变量时是有区别的,is函数是判断变量的内存地址是否相同,而 == 是判断变量的值是否相同,举例说明:
a = 1; b = 1.0
a is b # False
a == b # True
小心python变量赋值的陷阱
看到上面的所述知道了python变量赋值实则是引用,引用的是对象的内存地址。所赋的值可以分两类,一类是可变的,如列表,字典,集合;一类是不可变的,如字符串、元组。所以当对象为可变类型时就会出现一种情景,我们举例说明:
x = [1, 2, 3]
y = x
print x == y # True
print x is y # True
print x # [1, 2, 3]
print y # [1, 2, 3]
y.append(4)
print x # [1, 2, 3, 4]
print y # [1, 2, 3, 4]
可以看到y在进行调整时(添加了一个元素),x也跟着变动了,这进一步说明了,python中的变量赋值时引用,x,y 赋值时指向了同一处内存地址,所以当y变动时,x同样也发送了变化,解决这中现象的方法可以是x, y = [1,2,3], [1,2,3]这样赋值,虽说此时 x==y 是True,但是确实是2个不同的内存地址,所以 x is y 则是 False。或者可以使用copy模块,实质是相同的,创建2个不同的内存地址,使其分离。
Python中的赋值是一种语句,是将创建的一个数据对象,然后通过变量对这个值进行引用,变量即代表这个值,后面对这个数据的操作都通过这个变量来完成,这就是赋值。
Python的自定义函数格式中规中矩,用def引导自定义函数名,用括号给出该函数的参数,在冒号后换行通过缩进确定函数体。在格式上和条件判断语句有些相似。
如果函数名和变量名冲突了,相当于重新赋值。而python解释是从上到下的,也就是说此时谁在下面谁占用这个变量名。剩下的那个就只能在内存中等待垃圾回收了。
自定义函数的参数:
按道理来说,即使Python不严格要求定义函数参数,但这方面的知识有助于理解自定义函数中参数操作的情况,还是应该说明一下的。
可以简单地理解为在定义函数时括号中声明的参数是我们在函数使用中会用到的参数,在调用函数时括号中的变量就是参加函数运算用到的变量,换个名字参数(用于定义)和变量(用于调用)就足以理解了。