[해결] 파이썬에서 문자열 바꾸기

GunSmoke의 이미지

jump to python 보고 있습니다.

본문에서 문자열과 관련된 내용이 나오는데요.
http://wikidocs.net/mybook/read/page?pageid=35

Quote:

“Pithon”이란 문자열을 “Python"으로 바꾸려면?
위의 제목과 같이 "Pithon"이란 문자열을 "Python"으로 바꾸려면 어떻게 해야 할까? 제일 먼저 떠오르는 생각은 다음과 같을 것이다.

>>> a = "Pithon"
>>> a[1]
'i'
>>> a[1] = 'y'

위의 예에서 보듯이 우선 a라는 변수에 "Pithon"이란 문자열을 대입하고 a[1]이란 값이 'i'니까 a[1]을 위의 예처럼 'y'로 바꾸어 준다는 생각이다. 하지만 결과는 어떻게 나올까?

직접한번 실행해 보도록 하자.

당연히 에러가 나고 실패하게 될 것이다. 에러가 나는 이유는 문자열의 요소 값은 바꿀 수 있는 값이 아니기 때문이다. 왜 바꿀 수 없는가? 라는 질문을 하지는 말자. 그냥 바꿀 수 없는 것이다.

파이썬에서 문자열 요소 값을 변경할 수 없는 이유가 무엇인가요?

C에서는 어떠한가요?

ktd2004의 이미지

저도 요즘 파이썬을 공부하고 있습니다.
* 파이썬에서 문자열 자료형은 변경 불가능 자료형입니다.

C에서도 위와 같은 경우에는 문자열 상수(const)이므로 변경할 수 없습니다.

char *a = "Pithon";
a[1] = 'y';

틀린 부분이 있다면 지적 바랍니다. ^^;

mips의 이미지

파이썬에서 스트링은 immutable(변경 불가)입니다.

스트링 오브젝트를 인덱스로 수정하려면 그냥 스트링이 아니라

아래와 같이 하면 됩니다.

>>> from UserString import MutableString
>>> a = MutableString('abc') 
>>> a
'abc'
>>> a[0] = 'A'
>>> a
'Abc'
d3m3vilurr의 이미지

엇 이런 자료형이 있었군요.
slice와 + 연산으로 변환시켰었는데...

라이브러리에 보니 string 객체의 래퍼 클래스라고 나오네요:)

GunSmoke의 이미지

Quote:

C에서는 어떠한가요?

C에서 문자열을 변경할 수 없는 이유가... 기억이 나지 않네요. ㅠㅠ
전웅님 홈페이지 CARM 번역본을 보면되는데 홈페이지가 바뀌어버리는 바람에 hclc 뒤지기도 그렇고
아시는 분 있으시면 설명 부탁드립니다.

大逆戰

大逆戰

d3m3vilurr의 이미지

C에서는 두 케이스에 대해 다르게 동작합니다.
char *readonly = "string 1";
char writeable[] = "string 2";

해당 값이 할당되는 위치에 따른 차이지요.

lmk378의 이미지

c에서 문자열을 변경할 수 없는 것은 아니고 문자열의 위치에 따라 다르다고 할 수 있겠습니다.
const char* a = "asdf"; 같은 경우는 stack영역이 아닌 readonly 영역에 "asdf"가 생성이 되고(컴파일러에 의해)
이를 수정하려는 것은 당연히 안되겠죠.
(const 때문에 그런건 아닙니다. const는 readonly 영역의 데이터이므로 컴파일 워닝을 피하기 위해 붙여준 것이지 const를 썻다고 해서 readonly영역에 들어가는 것이 아닙니다.)
char a[] = "asdf";는 수정이 됩니다. "asdf"는 동일하게 readonly영역에 들어가 있습니다. 어떻게 수정이 될까요?
첫번째 예를 컴파일하면 컴파일러는 단순히 readonly영역을 가르키는 포인터만 스택영역에 잡고 해당 포인터에 "asdf"의 시작지점의 주소만 넘겨줄 뿐이죠
하지만 두번째 예는 컴파일러가 "asdf"의 크기만큼 스택을 잡고 복사하는 코드가 삽입되게됩니다. 때문에 수정가능한 것이죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.