_t_sne.py代码错误

Python012

_t_sne.py代码错误,第1张

1.NameError变量错误

2.IndentationError代码缩进错误

3.AttributeError对象属性错误

详细讲解

1.NameError变量名错误

报错:>>>print a

Traceback (most recent call last):

File "", line 1, in

NameError: name 'a' is not defined

解决方案:

先要给a赋值。才能使用它。在实际编写代码过程中,报NameError错误时,查看该变量是否赋值,或者是否有大小写不一致错误,或者说不小心将变量名写错了。

注:在Python中,无需显示变量声明语句,变量在第一次被赋值时自动声明。>>>a=1

>>>print a

1

2.IndentationError代码缩进错误

代码a=1b=2

if aprint a

报错:IndentationError: expected an indented block

原因:

缩进有误,python的缩进非常严格,行首多个空格,少个空格都会报错。这是新手常犯的一个错误,由于不熟悉python编码规则。像def,class,if,for,while等代码块都需要缩进。

缩进为四个空格宽度,需要说明一点,不同的文本编辑器中制表符(tab键)代表的空格宽度不一,如果代码需要跨平台或跨编辑器读写,建议不要使用制表符。

解决方案a=1b=2

if a print a

3.AttributeError对象属性错误

报错:>>>import sys

>>>sys.Path

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'module' object has no attribute 'Path'

原因:

sys模块没有Path属性。

python对大小写敏感,Path和path代表不同的变量。将Path改为path即可。>>>sys.path

['', '/usr/lib/python2.6/site-packages']

初学者遇到的错误实例:

使用错误的缩进

Python用缩进区分代码块,常见的错误用法:print('Hello!')

print('Howdy!')

导致:IndentationError: unexpected indent。同一个代码块中的每行代码都必须保持一致的缩进量if spam == 42:

print('Hello!')

print('Howdy!')

导致:IndentationError: unindent does not match any outer indentation level。代码块结束之后缩进恢复到原来的位置if spam == 42:

print('Hello!')

导致:IndentationError: expected an indented block,“:” 后面要使用缩进

变量没有定义if spam == 42:

print('Hello!')

导致:NameError: name 'spam' is not defined

获取列表元素索引位置忘记调用 len 方法

通过索引位置获取元素的时候,忘记使用 len 函数获取列表的长度。spam = ['cat', 'dog', 'mouse']

for i in range(spam):

print(spam[i])

导致:TypeError: range() integer end argument expected, got list. 正确的做法是:spam = ['cat', 'dog', 'mouse']

for i in range(len(spam)):

print(spam[i])

当然,更 Pythonic 的写法是用 enumeratespam = ['cat', 'dog', 'mouse']

for i, item in enumerate(spam):

print(i, item)

函数中局部变量赋值前被使用someVar = 42

def myFunction():

print(someVar)

someVar = 100

myFunction()

导致:UnboundLocalError: local variable 'someVar' referenced before assignment

当函数中有一个与全局作用域中同名的变量时,它会按照 LEGB 的顺序查找该变量,如果在函数内部的局部作用域中也定义了一个同名的变量,那么就不再到外部作用域查找了。因此,在 myFunction 函数中 someVar 被定义了,所以 print(someVar) 就不再外面查找了,但是 print 的时候该变量还没赋值,所以出现了 UnboundLocalError

在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 = 1b = 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个不同的内存地址,使其分离。