❶ 浅谈python中的变量赋值
在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。或者可以使用模块,实质是相同的,创建2个不同的内存地址,使其分离。
❷ Python变量可以只定义不赋值吗
题主你好,
答案肯定是不可以的.
我在官方文档上找了一段话,希望对你的理解有帮助:
先看第二个红框,说的是:
如果使用一个未被定义的变量, 解释器会报错.
关键是括号中粉底的那三个词assigned a value,用来解释python中怎么才叫定义一个变量,也就是说你想定义一个变量必须要给它赋值,只有给一个名称赋了值,才叫定义了一个变量. //有的语言中, 可以使用某个关键字先声明一个变量, 而赋值的操作可以后面做; 还有的语言,你可以只声明变量而不赋值, 后面使用该未赋值的变量时, 解释器会根据你声明的类型赋一个默认值,等等; 也就是说不同语言对变量的处理逻辑可能不同.而 python对变量的处理逻辑就是: 定义和赋值二者绑在一块了, 即赋值的过程同时完成了"定义+赋值", 不存在"只定义"这个过程.
而python中变量的赋值在第一个红框中也说明了,就是 使用等号连接变量和值, 左边变量右边值.
-----
希望可以帮到题主, 欢迎追问, 如果有啥错误欢迎指正.
❸ 在python中,变量就是指针,可以这样理解么
不是。
应该是指向指针的指针,只不过变量本身的地址在python中不提供访问途径。也就是只能访问这个指针所指地址(指针)和此地址里的内容。
比如
python中 a="xyz"
a本身的地址(对应的C运算:&a)python里是没有办法看到的。
python的id(a),返回的是"xyz"在内存中的起始地址,而不是存储a变量本身的地址。
❹ python的基本语法
python的基本语法如下:
一、变量的定义。
在编程语言中,存储一个数据,需要用变量进行接收。
2.标识符的命名规则。
标识符只能由字母、下划线“_”、数字组成。
标识符不能以数字开头。
标识符不能使用关键字。
标识符对大小写敏感。
(建议:标识符命名应“见名知意”)
3.python中的关键字。
'False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'
❺ 求Python中全局变量的详细理解
题主你好,
拿实际例子和你说一下吧, 更好理解一些.
我们在拿到一个python脚本的时候,往往发现里面都有如下语句:
=====
希望可以帮到题主, 欢迎追问.
❻ python中要在什么情况下使用变量
在python中,变量是存储在内存中的值,也就意味着使用python中的变量会开辟内存空间,python解释器会根据变量类型去开辟不同的内存空间进行变量值的存储,当你的程序需要存储值内容的时候就需要用到变量。
在Python中,变量定义时不需要提前定义类型,解释器会自动进行定义,如果需要改变量的类型则需要使用另外的函数。在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可。但是,当用变量的时候,必须要给这个变量赋值;如果只写一个变量,而没有赋值,那么Python认为这个变量没有定义。
❼ python中局部变量和全局变量的区别
全局变量:在函数外或全局空间中声明的变量称为全局变量,这些变量可以由程序中的任何函数访问;
局部变量:在函数内声明的任何变量都称为局部变量,此变量存在局部空间中,而不是全局空间中。
❽ python中的变量与垃圾回收
python中的变量和java中的变量本质是不一样的,python中的变量实质上是一个指针(指针的大小固定的)
is可以用来判断id是否相等
对于这种赋值,虽然所赋值是相同的,但是他们的id不同,即他们是不同的对象,a is b 即为false ,但是有个特例: a = 1 b = 1 时他们的id相同。其实这是python内部的优化机制,对于小整数和小的字符串来说,python在前边定义一个对象时,下次在遇到时会直接调用前边生成的对象,而不会去重新申请一个。
他们的对象内存地址不一样,但是,a和b里的值是相等的,这是由于a和b都为list,而list里有内置的魔法函数 eq 通过 eq 魔法函数可以判断里边两个的值是否相同,若相同则返回True
python中垃圾回收的算法回收的算法是采用引用计数,当程序中有一个变量引用该python对象时,python会自动保证该对象引用计数为1;当程序中有两个变量引用该python对象时,python会自动保证该对象计数器为2, 以此类推,当一个对象的引用计数器变为0 时,则说明程序中不再有变量对其进行引用,因此python就会回收该对象。
大多数情况,python的ARC都能准确,高效的回收系统中的每一个对象。但如果系统中出现循环引用时,比如a对象持有一个实例变量引用对象b,而b对象又持有一个实例变量引用对象a,此时 两个对象的计数器都为1, 而实际上python不再需要这两个对象,也没有程序在引用他们,系统回收他们时python的垃圾回收器就没有那儿快,要等到专门的循环垃圾回收器(Cyclic Garbage Collector)来检测并回收这种引用循环
当一个对象被垃圾回收式,python就会自动调用该对象的 del 方法
当没有注释掉x = im时, item对象被两个变量所引用,所以在执行完del im时并不会去回收item对象,所以先输出--------,当程序完全执行完成后,引用item的对象的变量被释放,然后系统便会执行 del 方法,回收item对象。
当 x = im被注释后,只有一个变量去引用item对象,所以在执行完后程序变回去调用 del 方法,回收item对象,然后在继续向下执行 输出-----