¿Qué estoy haciendo mal aquí?Agregar número para establecer
a = set().add(1)
print a # Prints `None`
estoy tratando de agregar el número 1
al conjunto vacío.
¿Qué estoy haciendo mal aquí?Agregar número para establecer
a = set().add(1)
print a # Prints `None`
estoy tratando de agregar el número 1
al conjunto vacío.
Es una convención en Python que los métodos que mutan las secuencias devuelvan None
.
considerar:
>>> a_list = [3, 2, 1]
>>> print a_list.sort()
None
>>> a_list
[1, 2, 3]
>>> a_dict = {}
>>> print a_dict.__setitem__('a', 1)
None
>>> a_dict
{'a': 1}
>>> a_set = set()
>>> print a_set.add(1)
None
>>> a_set
set([1])
Algunos pueden considerar esta convención "un misdesign horrible en Python", pero la Historia Preguntas gives the reasoning detrás de esta decisión de diseño Diseño y (con respecto a las listas):
¿Por qué no
list.sort(
) devuelve la lista ordenada?En situaciones donde el rendimiento importa, hacer una copia de la lista solo para ordenarlo sería un desperdicio. Por lo tanto,
list.sort()
ordena la lista en su lugar. Para recordarle este hecho, no devuelve la lista ordenada. De esta forma, no se le engañará accidentalmente al sobrescribir cuando necesite una copia ordenada, sino que también debe conservar la versión no ordenada.En Python 2.4 se ha agregado una nueva función incorporada -
sorted()
-. Esta función crea una nueva lista a partir de una iterable proporcionada, la ordena y la devuelve.
Sus problemas particulares con esta característica provienen de una mala interpretación de las buenas maneras de crear un conjunto en lugar de un diseño incorrecto del lenguaje. Como Lattyware points out, en las versiones de Python 2.7 y posteriores puede usar un conjunto literal a = {1}
o hacer a = set([1])
según Sven Marnach's answer.
Entre paréntesis, me gusta la convención de Ruby de colocar un signo de exclamación después de métodos que mutan los objetos, pero considero que el enfoque de Python es aceptable.
Debido add()
se modifing su conjunto, en lugar de regresar None
:
>>> empty = set()
>>> print(empty.add(1))
None
>>> empty
set([1])
usted debe hacer esto:
a = set()
a.add(1)
print a
Tenga en cuenta que usted está asignando a a
el resultado de la adición de 1
, y la operación add
, como se define en Python, devuelve None
- y eso es lo que se asigna a a
en tu código.
Alternativamente, usted puede hacer esto para inicializar un conjunto:
a = set([1, 2, 3])
El método add()
añade un elemento al conjunto, pero no devuelve el conjunto de nuevo - regresa None
.
a = set()
a.add(1)
o mejor
a = set([1])
funcionaría.
Gracias. Eso parece un mal diseño horrible en Python. ¿Qué piensas? – Randomblue
@Randomblue: Creo que si fuera completamente confuso si 'set.add()' devolviera el conjunto de nuevo. ¿Por qué debería? La convención es: si cambia el objeto en su lugar, devuelve 'None'. Si crea un nuevo objeto, devuelve el nuevo objeto. Justo como se supone que es. –
@RandomBlue: Creé una respuesta para responder a su pregunta de seguimiento. –
El método add actualiza el conjunto, pero devuelve None.
a = set()
a.add(1)
print a
va a asignar el valor devuelto por set().add(1)
a una. Este valor es None
, ya que add()
no devuelve ningún valor, sino que actúa in situ en la lista.
lo que quería hacer era esto:
a = set()
a.add(1)
print(a)
Por supuesto, este ejemplo es trivial, pero Python es compatible con los literales de conjunto, por lo que si realmente quería hacer esto, es mejor que hacer:
a = {1}
print(a)
las llaves denotan un conjunto (aunque se advirtió, {}
denota un dict vacía, no un conjunto vacío, debido al hecho de que entre llaves se utilizan tanto para dicts y conjuntos (dicts están separados por el uso de los dos puntos para separar claves y valores.)
Otra manera de hacerlo es relativamente simple sería:
a = set()
a = set() | {1}
esto crea una unión entre el conjunto A y un conjunto con 1 como el elemento
de impresión (a) los rendimientos {1 } entonces porque a tendría ahora todos los elementos de a y {1}
Alternativamente a a = set() | {1} considere operador "en el lugar":
a = set()
a |= {1}
@CharlesB Si está dando una respuesta, entonces debe hacerlo en una respuesta. Tenga en cuenta que es terriblemente antiponético usar punto y coma. Python está destinado a ser legible, y poner varias declaraciones en una sola línea es muy malo para la legibilidad. –
@GarethLatty: tampoco responde la pregunta. – user443854