Python 变量声明

2024-02-19

我想澄清一下 Python 中如何声明变量。

  1. 我见过变量声明 https://www.learnpython.org/en/Variables_and_Types as
class writer:
     path = ""

有时,没有显式声明,而只是使用初始化__init__:

def __init__(self, name):
    self.name = name

我明白的目的__init__,但是建议在任何其他函数中声明变量吗?

  1. 如何创建变量来保存自定义类型?
class writer:
    path = "" # string value
    customObj = ??

好吧,先说第一件事。

Python 中不存在“变量声明”或“变量初始化”之类的东西。

这就是我们所说的“赋值”,但也许应该称之为“命名”。

赋值意味着“左侧的这个名称现在指的是评估右侧的结果,无论它之前引用了什么(如果有的话)”。

foo = 'bar' # the name 'foo' is now a name for the string 'bar'
foo = 2 * 3 # the name 'foo' stops being a name for the string 'bar',
# and starts being a name for the integer 6, resulting from the multiplication

因此,Python 的名称(可以说是比“变量”更好的术语)没有关联的类型;价值观确实如此。您可以将相同的名称重新应用于任何事物,无论其类型如何,但该事物仍然具有依赖于其类型的行为。名称只是引用值(对象)的一种方式。这回答了你的第二个问题:你don't创建变量来保存自定义类型。您不需要创建变量来保存任何特定类型。您根本不“创建”变量。你给物体命名。

第二点:Python 在类方面遵循一个非常简单的规则,实际上比 Java、C++ 和 C# 等语言的一致性要高得多:里面声明的所有内容class块是类的一部分。所以,函数 (def)这里写的是方法,即类对象的一部分(不是按实例存储),就像 Java、C++ 和 C# 中一样;但这里还有其他名字also课程的一部分。同样,名称只是名称,它们没有关联的类型,并且函数也是对象在Python中。因此:

class Example:
    data = 42
    def method(self): pass

类也是对象,在Python中。

所以现在我们创建了一个object named Example,它代表所有事物的类别Examples。该对象有两个用户提供的属性(在 C++ 中,“成员”;在 C# 中,“字段或属性或方法”;在 Java 中,“字段或方法”)。其中一位被命名为data,它存储整数值42。另一个的名字叫method,它存储一个函数对象。 (Python 自动添加了更多属性。)

不过,这些属性仍然不是对象的真正一部分。从根本上说,一个对象只是更多名称(属性名称)的捆绑,直到您深入了解无法再分割的事物。因此,如果您有意设置的话,值可以在类的不同实例之间共享,甚至可以在不同类的对象之间共享。

让我们创建一个实例:

x = Example()

现在我们有一个名为的单独对象x,这是一个实例Example. The data and method实际上并不是对象的一部分,但我们仍然可以通过以下方式查找它们x因为 Python 在幕后做了一些魔法。当我们抬头看时method,特别是,我们将得到一个“绑定方法”(当我们调用它时,x自动传递为self参数,如果我们查找就不会发生这种情况Example.method直接地)。

当我们尝试使用时会发生什么x.data?

当我们检查它时,首先在对象中查找它。如果在对象中没有找到,Python 就会在类中查找。

然而,当我们分配给 x.data,Python将在对象上创建一个属性。它会not替换类的属性。

这使我们能够做object初始化。 Python会自动调用该类'__init__创建新实例时的方法(如果存在)。在此方法中,我们可以简单地分配给属性来为每个对象上的该属性设置初始值:

class Example:
    name = "Ignored"
    def __init__(self, name):
        self.name = name
    # rest as before

现在我们必须指定一个name当我们创建一个Example,并且每个实例都有自己的name。 Python会忽略class属性Example.name每当我们查找.name实例的属性,因为首先会找到实例的属性。

最后一个警告:修改(变异)和赋值是不同的事情!

在 Python 中,字符串是不可变的。它们不能被修改。当你这样做时:

a = 'hi '
b = a
a += 'mom'

You 不要换原始的“hi”字符串。这在 Python 中是不可能的。相反,您创建一个new string 'hi mom',并导致a不再是一个名字'hi ',并开始成为'hi mom'反而。我们创造b一个名字'hi '以及重新应用后a name, b仍然是一个名字'hi ', 因为'hi '仍然存在并且没有改变。

但列表可以更改:

a = [1, 2, 3]
b = a
a += [4]

Now b也是 [1, 2, 3, 4],因为我们做了b同一事物的名称a命名,然后我们改变了那个东西。我们没有创建新列表a命名,因为Python只是简单地对待+=对于列表则不同。

这对于对象很重要,因为如果您有一个列表作为类属性,并使用一个实例来修改该列表,那么该更改将在所有其他实例中“看到”。这是因为 (a) 数据实际上是类对象的一部分,而不是任何实例对象; (b) 因为您正在修改列表而不是进行简单的赋值,所以您没有创建隐藏类属性的新实例属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 变量声明 的相关文章

  • 如何恢复tensorflow inceptions检查点文件(ckpt)?

    I have inception resnet v2 2016 08 30 ckpt文件是预先训练的初始模型 我想使用恢复这个模型 saver restore sess ckpt filename 但为此 我将需要编写训练该模型时使用的变量
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 如何将 GAE 中一种 Kind 中的所有实体复制到另一种 Kind 中,而无需显式调用每个属性

    我们如何使用function clone entity 如中所述在 Python 中复制 Google App Engine 数据存储中的实体 而无需在 编译 时知道属性名称 https stackoverflow com question
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • 如何使用 Python 3 检查目录是否包含文件

    我到处寻找这个答案但找不到 我正在尝试编写一个脚本来搜索特定的子文件夹 然后检查它是否包含任何文件 如果包含 则写出该文件夹的路径 我已经弄清楚了子文件夹搜索部分 但检查文件却难倒了我 我发现了有关如何检查文件夹是否为空的多个建议 并且我尝
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • Unicode 代码页 1200 到底是什么?

    在研究一些本地化选项时 我偶然发现它是 Visual Studio 中的保存选项 Unicode 代码页 1200 到底是什么 微软文档页面代码页标识符 https learn microsoft com en us windows win
  • 使用 printf 格式在 C 中打印等宽列

    我想在 C 中使用 printf 打印列 我编写了以下代码 include
  • didReceiveRemoteNotification:fetchCompletionHandler:从图标打开与推送通知

    我正在尝试实现后台推送通知处理 但在确定用户是否从发送的推送通知打开应用程序而不是从图标打开应用程序时遇到问题 void application UIApplication application didReceiveRemoteNotif
  • 在 JavaScript 上添加/删除监听器(垃圾收集器)

    我有一个关于添加 删除 DOM 对象的侦听器的快速问题 我想问垃圾收集器是否能够在从页面中删除元素时收集内存 示例 一个 ul 带有几个孩子列表的标签 li var ul document getElementById someParent
  • 带有模板参数的模板中的默认值 (C++)

    假设我有一个模板 称为 ExampleTemplate 它接受两个参数 容器类型 例如列表 向量 和包含类型 例如 float bool 等 由于容器实际上是模板 因此该模板有一个模板参数 这就是我必须写的 include
  • python 异常。UnicodeDecodeError: 'ascii' 编解码器无法解码字节 0xa7

    我正在将 scrapy 与 python 结合使用 并且在 python item pipline 中有此代码 def process item self item spider import pdb pdb set trace ID st
  • Django 表单 - 验证错误后重新加载时变量类型发生变化

    我花了一些时间 但无法找出以下行为的确切原因 我有一个 Django 表单 在模板中我试图查看列表中是否存在整数 然后用它做一些事情 if pk in form area value form area value is a list li
  • 有没有办法设置X轴的背景颜色

    我检查了文档 我能找到的只是设置笔划 但我需要整个 x 轴背景不仅仅是字体颜色 Renaldo Balaj 好吧 你可以像这里一样向你的图表添加一个 svg 元素 https codesandbox io s highlight zomm
  • 如何比较两个日期[重复]

    这个问题在这里已经有答案了 我有一个带有 PHP 前端的 MySQL 数据库 在我的记录中 我有一个直接从数据库访问的发布日期和到期日期 我需要做的是检查并查看是否有任何记录的过期日期与发布日期相符 就像是 你可以这样做 posted da
  • LiveData 观察者未调用

    我有一个活动 TabBarActivity承载一个片段 EquipmentRecyclerViewFragment 片段收到 LiveData 回调 但 Activity 没有 在调试模式下使用断点进行证明 奇怪的是 如果我调用 ViewM
  • dyld:惰性符号绑定失败:找不到符号:_PQsetErrorContextVisibility

    跑步时 psql 我收到这个错误 dyld lazy symbol binding failed Symbol not found PQsetErrorContextVisibility Referenced from usr local
  • 未定义引用错误,无法创建共享库

    尝试了很多方法来解决问题但没有运气 这是我的 Android mk LOCAL PATH call my dir include CLEAR VARS LOCAL MODULE avcodec LOCAL SRC FILES libavco
  • 什么是最好的:每条记录 1 个表,还是 1 个表中所有记录都与外键链接?

    我有一个应用程序 可以让用户创建不同的表单 调查 然后填写它们 所以它是纸张的替代品 这是我在应用程序中使用的当前模型 Table 1 SURVEYS TABLE ID name description Table 2 name of th
  • 会话与会话工厂之间的区别 - Hibernate?

    除了以下几点之外 我们还有其他差异吗 另请验证以下是否正确 SessionFactory每个应用程序都有一个对象 并且Session每个客户只有一个对象 SessionFactory是创建和管理Sessions Session就是提供一个C
  • Android TableLayout 不垂直滚动

    预先感谢您的任何帮助 我对 Android 很陌生 这是我的问题 我正在使用 TableLayout 来显示可编辑字段 大约有二十行要显示 在较小的设备上 行会溢出屏幕 我需要视图允许用户上下滚动 我缺少什么 尝试将 TableLayout
  • 在windows上打开指定目录下的Cygwin命令

    我使用 phpstorm 和它的终端设施 在终端部分我输入F Projects cygwin64 bin mintty exe i Cygwin Terminal ico 所以它使用 Cygwin 作为终端 但它会在主文件夹中打开它 是否可
  • XML 不可能是整个程序

    当我包含以下 js 文件 其中包含 jquery 时 我在 Firebug 中收到错误 XML 不能是整个程序 JS文件包含参考 JS文件内容 id txtAddress1S blur function id txtAddress1S va
  • WPF 中延迟后重置变量值

    我有一些执行并获取执行返回值的代码 我将此值设置为窗口的依赖属性 因为有样式触发器绑定到它 当变量为 0 时 使用默认样式 1 时使用偏红色样式 2 时使用绿色样式 但一段时间后我必须以某种实际的方式重置这种风格 做到这一点最简单的方法是什
  • High Sierra 中的 NSCollectionView 内存泄漏?

    我通过 Instruments 注意到 NSCollectionView 中存在内存泄漏 当我追踪代码时 它显示了下面的特定行 collectionView makeItem withIdentifier identifier for in
  • Python 变量声明

    我想澄清一下 Python 中如何声明变量 我见过变量声明 https www learnpython org en Variables and Types as class writer path 有时 没有显式声明 而只是使用初始化 i