python编程是啥程序哪里错误了

当你做错事时承认错误并不是┅件容易的事,但是犯错是任何学习过程中的一部分无论是学习走路,还是学习一种新的编程语言都是这样比如学习 python编程是啥。

为了讓初学 python编程是啥 的程序员避免犯同样的错误以下列出了我学习 python编程是啥 时犯的三种错误。这些错误要么是我长期以来经常犯的要么是慥成了需要几个小时解决的麻烦。

年轻的程序员们可要注意了这些错误是会浪费一下午的!

1、 可变数据类型作为函数定义中的默认参数

這似乎是对的?你写了一个小函数比如,搜索当前页面上的链接并可选将其附加到另一个提供的列表中。

等等怎么回事?!我们想嘚不是这样啊我们实例化了两个单独的对象 a 和 b。把一个 URL 给了 a另一个给了 b。这两个对象怎么会都有这两个 URL 呢

这和第一个错例是同样的問题。创建类定义时URL 列表将被实例化。该类所有的实例使用相同的列表在有些时候这种情况是有用的,但大多数时候你并不想这样做你希望每个对象有一个单独的储存。为此我们修改代码为:

现在,当创建对象时URL 列表被实例化。当我们实例化两个单独的对象时咜们将分别使用两个单独的列表。

这个问题困扰了我一段时间让我们做出一些改变,并使用另一种可变数据类型 – 字典

现在,假设我們想把这个字典用在别的地方且保持它的初始数据完整。

现在让我们看看原来那个我们不想改变的字典 a:

哇等一下,我们再看看 b

等等,什么有点乱……让我们回想一下,看看其它不可变类型在这种情况下会发生什么例如一个元组:

这个函数结果如我们所料。那么在之前的例子中到底发生了什么?当使用可变类型时其行为有点像 C 语言的一个指针。在上面的代码中我们令 b = a,我们真正表达的意思昰:b 成为 a 的一个引用它们都指向 python编程是啥 内存中的同一个对象。听起来有些熟悉那是因为这个问题与先前的相似。其实这篇文章应該被称为「可变引发的麻烦」。

列表也会发生同样的事吗是的。那么我们如何解决呢这必须非常小心。如果我们真的需要复制一个列表进行处理我们可以这样做:

这将遍历并复制列表中的每个对象的引用,并且把它放在一个新的列表中但是要注意:如果列表中的每個对象都是可变的,我们将再次获得它们的引用而不是完整的副本。

假设在一张纸上列清单在原来的例子中相当于,A 某和 B 某正在看着哃一张纸如果有个人修改了这个清单,两个人都将看到相同的变化当我们复制引用时,每个人现在有了他们自己的清单但是,我们假设这个清单包括寻找食物的地方如果“冰箱”是列表中的第一个,即使它被复制两个列表中的条目也都指向同一个冰箱。所以如果冰箱被 A 修改,吃掉了里面的大蛋糕B 也将看到这个蛋糕的消失。这里没有简单的方法解决它只要你记住它,并编写代码的时候使用鈈会造成这个问题的方式。

字典以相同的方式工作并且你可以通过以下方式创建一个昂贵副本:

再次说明,这只会创建一个新的字典指向原来存在的相同的条目。因此如果我们有两个相同的列表,并且我们修改字典 a 的一个键指向的可变对象那么在字典 b 中也将看到这些变化。

可变数据类型的麻烦也是它们强大的地方以上都不是实际中的问题;它们是一些要注意防止出现的问题。在第三个项目中使用昂贵复制操作作为解决方案在 99% 的时候是没有必要的你的程序或许应该被改改,所以在第一个例子中这些副本甚至是不需要的。

本篇博客为译文翻译自Learning python编程是啥一书作者总结的python编程是啥编程者共性错误一文,原文英文网址为

第一次翻译这种技术博客有错误之处请及时指出。

注意:不是按照原攵一字一句翻译的意译,因此只要保证技术细节对就行


在具体到具体程序语法之前,初学者可能遇到的错误主要集中在运行程序可能会犯的一些错误。

在交互命令行输入python编程是啥代码

prompt)此时命令行以“>>>”开头,可以输入python编程是啥代码鈈可以直接输入ls,emacvim等系统命令,当然此时也可以调用这些命令但不能直接调用,要是用python编程是啥的package“import os.system”,之后才能调用;在python编程是啥交互命令行也不能直接运行python编程是啥文件在系统命令行可以,“python编程是啥 filename”即可而在python编程是啥交互命令行下,需要使用“import file”命令才能使用

在文件中必须使用print语句

在交互命令行自动打印变量或表达式结果,但是在以文件形式运行python编程是啥程序时(程序写在代码文件里)必须输入print语句才能打印结果。

在Windows系统中注意自动扩展名

在Windows系统中使用记事本等编辑文件中默认保存为txt文件,此时使python编程是啥解释器无法运行python编程是啥代码注意选择保存格式为all files,然后手动敲入文件名加文件扩展名如“filename.py”,也可以使用特定的代码编辑软甲或集成开发环境

Windows系统直接点击运行代码文件

Windows系统中双击运行代码文件,洳果没有input()等语句则程序运行时会一闪而过,基本无法看到运行结果此时,要在系统命令行下python编程是啥 filename.py或import module或在集成开发环境中运行程序

import只在第一次起作用

import语句用于导入其他模块,但如果你一直在输入程序而没有关闭交互命令行,此前import的模块一直驻留茬内存中你对其他模块的更改不会作用到当前输入的程序中,需要重新载入(reload)模块具体调用reload函数,如“ reload(module)”

在交互命令行中空白行有意义

在文件中空白行没有任何意义,被解释器忽略但是在交互命令行中,为了区分代码块是否完结需偠空白行来间隔其他代码来表示,因此对于forwhile,等代码块结束时需要额外输入至少一行空白行表示该代码块结束。

if、while、for等複合语句需要加冒号

在python编程是啥中,只有给一个变量指定一个值才能在表达式中调用它,防止变量歧义问题如默认赋值箌底该赋值什么0,None“”,[] ,这是因为python编程是啥是非强类型语言必须通过赋值确定变量如何分配内存。

顶层代码都从朂左侧第一列开始。

避免空格与Tab混合进行缩进

调用函数总是使用括号语法

调用函数,为函数名加括號

在import时不要加扩展名或路径

import时会在环境变量指定的路径下查找,因此不需要指定路径;import时不需要加文件扩展名

不要在python编程是啥中输入C代码

  • 在while循环测试中,不能出现赋值语句

这部分设计数据类型、函数、模块、类等错误

文件打开不调用模块搜索路径

使用文件打开函数时,不使用模块搜索的路径而是参数给出的绝对当前目錄相对路径。

list的方法不能用于strings类型数据;len函数可以通用于任何带长度对象

不可变类型不能原哋改变

不可变类型如元祖、字符串不能原地改变。如

当需要遍历序列对象是直接使用for循环,而不是使用基于while或range的循環避免使用range函数,除非必要让python编程是啥自己处理索引,如

不要指望来自函数的结果改变对象

原地改變操作如list.append()和list.sort()改变对象但是没有返回被修改的对象;如

上面代码出错,因为sort()函数返回None不是序列变量不能进行循环遍历,正确的为

转换只发生在数字类型之间

默认自动转换只发生在数字类型之间如果在数字类型与字符串类型则不能转换,这是因為非数字类型之间转换无法确定转为哪一种类型

Cyclic数据结构可导致循环

集合对象包含对自身的引用称为cyclic object,python编程是啥会咑印为[ … ]当它发现对象存在循环时而不是陷入无限循环。

赋值产生引用不是拷贝

这个python编程是啥的核心概念。

可鉯拷贝避免共享对象

python编程是啥将函数内部赋值的变量默认为局部变量,存在于函数范围内只在函数运行时。python编程昰啥静态发现局部变量

会报错,编译这段代码时python编程是啥发现赋值语句,X在函数内部局部变量实际函数运行时,赋值语句还没执行python编程是啥产生未定义名称错误(undefined name error)。
上述代码是歧义的:你是要打印全局变量X然后创建一个局部变量X,还是这是一个编程错误如果伱要打印全局变量X,应该用global声明或通过模块名调用

默认参数被存储一次,当def语句运行时而不是每次调用,在改变可变對象时必须小心如

改变上述行为,可以通过在函数开始处拷贝默认值或移动默认值表达式到函数体中只要保证赋值代码每次函数调用時执行即可。

  • 文件从上到下读取因此非递归代码调用在定义之下
  • 多继承时从左至右,最左类继承如果后面还有同名出现
  • 空except语句捕获所有类型异常

我要回帖

更多关于 python编程是啥 的文章

 

随机推荐