为什么"is"关键字不在这里工作?

Gni*_*ohz 5 python integer

我知道这is用于比较两个对象是否相同但是==是否相等.根据我的经验is总是为数字工作,因为Python重用数字.例如:

>>>a = 3
>>>a is 3
True
Run Code Online (Sandbox Code Playgroud)

is每当我将某些东西与数字进行比较时,我习惯使用它.但是is下面这个程序不起作用:

from collections import namedtuple
# Code taken directly from [Udacity site][1].
# make a basic Link class
Link = namedtuple('Link', ['id', 'submitter_id', 'submitted_time', 'votes',
                           'title', 'url'])

# list of Links to work with
links = [
    Link(0, 60398, 1334014208.0, 109,
         "C overtakes Java as the No. 1 programming language in the TIOBE index.",
         "http://pixelstech.net/article/index.php?id=1333969280"),
    Link(1, 60254, 1333962645.0, 891,
         "This explains why technical books are all ridiculously thick and overpriced",
         "http://prog21.dadgum.com/65.html"),
    Link(23, 62945, 1333894106.0, 351,
         "Learn Haskell Fast and Hard",
         "http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/"),
    Link(2, 6084, 1333996166.0, 81,
         "Announcing Yesod 1.0- a robust, developer friendly, high performance web framework for Haskell",
         "http://www.yesodweb.com/blog/2012/04/announcing-yesod-1-0"),
    Link(3, 30305, 1333968061.0, 270,
         "TIL about the Lisp Curse",
         "http://www.winestockwebdesign.com/Essays/Lisp_Curse.html"),
    Link(4, 59008, 1334016506.0, 19,
         "The Downfall of Imperative Programming. Functional Programming and the Multicore Revolution",
         "http://fpcomplete.com/the-downfall-of-imperative-programming/"),
    Link(5, 8712, 1333993676.0, 26,
         "Open Source - Twitter Stock Market Game - ",
         "http://www.twitstreet.com/"),
    Link(6, 48626, 1333975127.0, 63,
         "First look: Qt 5 makes JavaScript a first-class citizen for app development",
         "http://arstechnica.com/business/news/2012/04/an-in-depth-look-at-qt-5-making-javascript-a-first-class-citizen-for-native-cross-platform-developme.ars"),
    Link(7, 30172, 1334017294.0, 5,
         "Benchmark of Dictionary Structures", "http://lh3lh3.users.sourceforge.net/udb.shtml"),
    Link(8, 678, 1334014446.0, 7,
         "If It's Not on Prod, It Doesn't Count: The Value of Frequent Releases",
         "http://bits.shutterstock.com/?p=165"),
    Link(9, 29168, 1334006443.0, 18,
         "Language proposal: dave",
         "http://davelang.github.com/"),
    Link(17, 48626, 1334020271.0, 1,
         "LispNYC and EmacsNYC meetup Tuesday Night: Large Scale Development with Elisp ",
         "http://www.meetup.com/LispNYC/events/47373722/"),
    Link(101, 62443, 1334018620.0, 4,
         "research!rsc: Zip Files All The Way Down",
         "http://research.swtch.com/zip"),
    Link(12, 10262, 1334018169.0, 5,
         "The Tyranny of the Diff",
         "http://michaelfeathers.typepad.com/michael_feathers_blog/2012/04/the-tyranny-of-the-diff.html"),
    Link(13, 20831, 1333996529.0, 14,
         "Understanding NIO.2 File Channels in Java 7",
         "http://java.dzone.com/articles/understanding-nio2-file"),
    Link(15, 62443, 1333900877.0, 1244,
         "Why vector icons don't work",
         "http://www.pushing-pixels.org/2011/11/04/about-those-vector-icons.html"),
    Link(14, 30650, 1334013659.0, 3,
         "Python - Getting Data Into Graphite - Code Examples",
         "http://coreygoldberg.blogspot.com/2012/04/python-getting-data-into-graphite-code.html"),
    Link(16, 15330, 1333985877.0, 9,
         "Mozilla: The Web as the Platform and The Kilimanjaro Event",
         "https://groups.google.com/forum/?fromgroups#!topic/mozilla.dev.planning/Y9v46wFeejA"),
    Link(18, 62443, 1333939389.0, 104,
         "github is making me feel stupid(er)",
         "http://www.serpentine.com/blog/2012/04/08/github-is-making-me-feel-stupider/"),
    Link(19, 6937, 1333949857.0, 39,
         "BitC Retrospective: The Issues with Type Classes",
         "http://www.bitc-lang.org/pipermail/bitc-dev/2012-April/003315.html"),
    Link(20, 51067, 1333974585.0, 14,
         "Object Oriented C: Class-like Structures",
         "http://cecilsunkure.blogspot.com/2012/04/object-oriented-c-class-like-structures.html"),
    Link(10, 23944, 1333943632.0, 188,
         "The LOVE game framework version 0.8.0 has been released - with GLSL shader support!",
         "https://love2d.org/forums/viewtopic.php?f=3&t=8750"),
    Link(22, 39191, 1334005674.0, 11,
         "An open letter to language designers: Please kill your sacred cows. (megarant)",
         "http://joshondesign.com/2012/03/09/open-letter-language-designers"),
    Link(21, 3777, 1333996565.0, 2,
         "Developers guide to Garage48 hackatron",
         "http://martingryner.com/developers-guide-to-garage48-hackatron/"),
    Link(24, 48626, 1333934004.0, 17,
         "An R programmer looks at Julia",
         "http://www.r-bloggers.com/an-r-programmer-looks-at-julia/")]


# links is a list of Link objects. Links have a handful of properties. For
# example, a Link's number of votes can be accessed by link.votes if "link" is a
# Link.

# make the function query() return a list of Links submitted by user 62443, by
# submission time ascending

def query():
    print "hello"
    print [link for link in links if link.submitter_id == 62443] # is does not work
    return sorted([link for link in links if link.submitter_id == 62443],key = lambda x: x[2])
query()
Run Code Online (Sandbox Code Playgroud)

当我is在这样的查询函数中使用时,[link for link in links if link.submitter_id is 62443]我会得到一个空列表.但如果我使用==它,它工作得很好.

在大多数情况下,代码直接来自udacity网站,但我也在我的本地机器上尝试过.同样的结果.所以我认为这个数字现在是不同的对象,但为什么呢?有需要吗?

编辑:是的.我承认这个问题是重复的,应该关闭.但它与第一个帖子不同,而不是第二个帖子.在发布之前我不知道这个问题.

我的问题是我认为数字对象总是会被重用.

感谢大家,我摆脱了一个坏习惯.

Tim*_*ers 9

除了深入研究您正在使用的特定Python版本的实现细节之外,您的问题没有答案. 没有定义是否a == b暗示a is b何时ab是数字.这通常是正确的,特别是对于"小整数",因为CPython保留了一些小整数对象的缓存,并且通常(并非总是!)为给定的小整数值返回相同的对象.但是关于这一点的任何内容都不会在发行版中定义,保证甚至始终相同.

考虑内存地址可能会有点帮助,因为这id()是在CPython中实现的方式.但是其他实现使用不同的实现id().例如,我被告知id()在Jython(用Java实现的Python)中实现是一个很大的痛苦,因为Java在垃圾收集期间可以自由地在内存中移动对象(CPython没有:在CPython中,对象总是占用最初分配的内存为此,直到物体成为垃圾).

唯一的预期 - 和支持 - 用于is检查对象的两个名称是否实际上解析为同一个对象.例如,无论何种类型b,之后

a = b
Run Code Online (Sandbox Code Playgroud)

一定是这样的

a is b
Run Code Online (Sandbox Code Playgroud)

True.这有时很有用.

_sentinel = object() # create a unique object

def somefunc(optional=_sentinel):
    if optional is _sentinel:  # we know for sure nothing was passed
        ...
Run Code Online (Sandbox Code Playgroud)

另一个主要用途是保证为单身的少数对象. None,True并且False是这方面的例子,实际上写作是惯用的:

if a is None:
Run Code Online (Sandbox Code Playgroud)

代替:

if a == None:
Run Code Online (Sandbox Code Playgroud)

第一种方式成功,当且仅当a事实上绑定到单例None对象时,但第二种方式可能成功,如果a是任何类型a.__eq__(None)返回True.

不要is用于数字.那太疯狂了;-)


Len*_*bro 5

如果两个变量是同一个对象,并且用于检查相等性(如果对象相等),那么is检查标识是正确的.(所涉及的等级决定了相同的手段).==

你是正确的,is用来检查两个数字是否相等通常是有效的,因为Python重用数字,所以通常当它们相等时,它们也是相同的.

但你确实注意到这听起来如何.你应该通过身份检查来检查两个数字是否相等?不,当然不.您应该使用相等性检查来检查对象是否相等.就这么简单.

您经常可以使用身份检查来检查数字的相等性只是Python重用数字的副作用,它可以节省内存,这是一个实现细节.

此外,在Python中3 == 3.0,但是3 is not 3.0.所以你应该因此而使用==.